Files
Main/Assets/Editor/DIY/FLSTool/FlsUtils.cs
2025-01-25 04:38:09 +08:00

894 lines
33 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using SceneEditor.Proxy.Editor;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Thousandto.Cfg.Data;
using Thousandto.Code.Logic;
using Thousandto.Core.Base;
using UnityEditor;
namespace Thousandto.Package
{
/// <summary>
/// 生成fls文件的工具类, 暂时不用
/// </summary>
public class FlsUtils
{
public static string SubFlsRoot = "../SubResource/FLS/";
#if UNITY_ANDROID
public static string SubAllRoot = "../SubResource/Android/ResAll/";
static string _subResRoot = "../SubResource/Android/ResAll/GameAssets/Resources/";
#elif UNITY_IPHONE
public static string SubAllRoot = "../SubResource/IOS/ResAll/";
static string _subResRoot = "../SubResource/IOS/ResAll/GameAssets/Resources/";
#elif UNITY_WEBPLAYER
public static string SubAllRoot = "../SubResource/WebPlayer/ResAll/";
static string _subResRoot = "../SubResource/WebPlayer/ResAll/GameAssets/Resources/";
#else //windows
public static string SubAllRoot = "../SubResource/Windows/ResAll/";
static string _subResRoot = "../SubResource/Windows/ResAll/GameAssets/Resources/";
#endif
static string _assetRoot = "Assets/GameAssets/Resources/";
static string _cinematicPath = "Cinematics";
static string _lanStr = LanguageConstDefine.KR;
//默认3段
static int _partialCount = 3;
public static void Build(string lan)
{
_lanStr = lan;
Start();
}
public static void Start()
{
EditorUtility.DisplayProgressBar("生成FLS文件", "", 0);
var oldFlsList = Utils.GetFiles(SubFlsRoot, "*.fls", SearchOption.TopDirectoryOnly, PkgConstDefine.CommonExceptionEx);
foreach (string oldFls in oldFlsList)
{
string parent = Path.GetDirectoryName(oldFls);
if (!parent.EndsWith("FLS"))
{
continue;
}
File.Delete(oldFls);
}
//删除旧的分段资源
Utils.DeleteFileOrDir(string.Format("../SubResource/{0}/Res1", PackageManager.GetSourceDirByBuildTarget()));
Utils.DeleteFileOrDir(string.Format("../SubResource/{0}/Res2", PackageManager.GetSourceDirByBuildTarget()));
Utils.DeleteFileOrDir(string.Format("../SubResource/{0}/Res3", PackageManager.GetSourceDirByBuildTarget()));
EditorUtility.DisplayProgressBar("生成FLS文件", "", 0.3f);
//这里开始自动分fls
work();
//拷贝fls0到FLS目录
string fls0 = SubFlsRoot + _lanStr + "/fls0.fls";
if (File.Exists(fls0))
File.Copy(fls0, SubFlsRoot + "fls0.fls");
//拷贝fls.fls到上一级目录
string fls = SubFlsRoot + _lanStr + "/fls.fls";
if (File.Exists(fls))
File.Copy(fls, SubFlsRoot + "fls.fls");
var newFlsList = Utils.GetFiles(SubFlsRoot, "*.fls", SearchOption.TopDirectoryOnly, PkgConstDefine.CommonExceptionEx);
EditorUtility.DisplayProgressBar("生成FLS文件", "拷贝分段资源到对应目录", 0.9f);
//下面是拷贝资源到分段资源路径
//foreach (string newFls in newFlsList)
//{
// string flsName = Path.GetFileNameWithoutExtension(newFls);
// string copyToDir = string.Format("../SubResource/{0}/", PackageManager.GetSourceDirByBuildTarget());
// if (flsName == "fls1")
// {
// copyToDir += "Res1";
// }
// else if (flsName == "fls2")
// {
// copyToDir += "Res2";
// }
// else if (flsName == "fls3")
// {
// copyToDir += "Res3";
// }
// var fileListInFls = File.ReadAllLines(newFls);
// //从1开始第一行是描述
// for (int i = 0; i < fileListInFls.Length; ++i )
// {
// if (fileListInFls[i].IndexOf(",") != -1)
// continue;
// string sourceFile = SubAllRoot + fileListInFls[i];
// string toFile = copyToDir + "/" + fileListInFls[i];
// string toDir = toFile.Substring(0, toFile.LastIndexOf("/"));
// if (!Directory.Exists(toDir))
// {
// Directory.CreateDirectory(toDir);
// }
// if (File.Exists(sourceFile))
// {
// if (Path.GetFullPath(sourceFile) == Path.GetFullPath(toFile)) continue;
// File.Copy(sourceFile, toFile, true);
// }
// }
//}
EditorUtility.DisplayProgressBar("生成FLS文件", "完成", 1.0f);
EditorUtility.ClearProgressBar();
}
private static void work()
{
LuaDataConverter.Load();
var sceneCfgFileList = Utils.GetFiles(SubFlsRoot + _lanStr, "*.scene", SearchOption.TopDirectoryOnly);
for (int i = 0; i < sceneCfgFileList.Count; ++i)
{
combineFls(sceneCfgFileList[i]);
}
}
public static void Test2()
{
LuaDataConverter.Load();
var itor = DeclareMapsetting.CacheData.Values.GetEnumerator();
while (itor.MoveNext())
{
var mapID = itor.Current.MapId;
string mapName = itor.Current.LevelName;
var fileList = addDependenceRes(mapID);
string filePath = SubFlsRoot + mapID + ".txt";
File.WriteAllLines(filePath, fileList.ToArray());
UnityEngine.Debug.LogError("生成场景关联文件列表: " + filePath);
}
EditorUtility.ClearProgressBar();
}
/// <summary>
/// 根据MapSetting表生成资源列表
/// </summary>
public static void GenResListByMapSetting()
{
Dictionary<string, List<string>> mapDict = new Dictionary<string, List<string>>();
mapDict.Clear();
LuaDataConverter.Load();
var itor = DeclareMapsetting.CacheData.Values.GetEnumerator();
while (itor.MoveNext())
{
var mapID = itor.Current.MapId;
//场景名字
string mapName = itor.Current.LevelName;
var fileList = addDependenceRes(mapID);
if (mapDict.ContainsKey(mapName))
{
List<string> pathList = mapDict[mapName];
for (int i = 0; i < fileList.Count; i++)
{
//去掉重复的资源路径
if (!pathList.Contains(fileList[i]))
{
pathList.Add(fileList[i]);
}
}
//再把新增的再保存到字典里面
mapDict[mapName] = pathList;
}
else
{
mapDict.Add(mapName, fileList);
}
}
//遍历场景的资源列表,生成文件
var iter = mapDict.GetEnumerator();
while (iter.MoveNext())
{
List<string> mapResPathList = iter.Current.Value;
string filePath = SubFlsRoot + iter.Current.Key + ".txt";
File.WriteAllLines(filePath, mapResPathList.ToArray());
UnityEngine.Debug.LogError("根据MapSetting表生成资源列表: " + filePath);
}
EditorUtility.ClearProgressBar();
}
//合并.scene和.fls文件到新的fls文件
private static void combineFls(string sceneFile)
{
//场景id列表
string[] sceneIdArray = File.ReadAllLines(sceneFile);
//场景关联资源
List<string> sceneResList = new List<string>();
for (int i = 0; i < sceneIdArray.Length; ++i)
{
EditorUtility.DisplayProgressBar("生成FLS文件", "搜索场景关联的资源", 0.5f);
sceneResList.AddRange(addDependenceRes(sceneIdArray[i]));
}
EditorUtility.DisplayProgressBar("生成FLS文件", "收集场景资源", 0.7f);
int count = 0;
long size = 0;
//去重并且计算count和size
var allRes = optimizeList(sceneResList, out count, out size);
//合并场景资源和默认资源
string flsFileName = Path.ChangeExtension(sceneFile, "fls");
combineFlsFile(allRes, flsFileName, ref count, ref size);
//合并默认路径
string flsDir = Path.ChangeExtension(sceneFile, "dir");
combineFlsDir(allRes, flsDir, ref count, ref size);
EditorUtility.DisplayProgressBar("生成FLS文件", "合并文件列表", 0.9f);
if (allRes.Count > 0)
{
//新的fls路径就是去掉语言路径的默认fls路径
string saveFlsPath = flsFileName.Replace(_lanStr + "/", "");
StreamWriter sw = new StreamWriter(saveFlsPath);
sw.WriteLine(string.Format("{0},{1}", count, size));
var itor = allRes.GetEnumerator();
while (itor.MoveNext())
{
//还有manifest或者没有后缀则跳过
if (itor.Current.IndexOf(".manifest") > 0 || itor.Current.IndexOf(".") == -1 || itor.Current.IndexOf(".meta") > 0)
continue;
sw.WriteLine(itor.Current);
}
sw.Close();
}
EditorUtility.DisplayProgressBar("生成FLS文件", "完成", 1.0f);
}
//读取fls.dir资源
private static List<string> readFlsDir(string flsDir)
{
List<string> resList = new List<string>();
if (!File.Exists(flsDir))
{
return resList;
}
string[] dirList = File.ReadAllLines(flsDir);
for (int i = 0; i < dirList.Length; ++i)
{
string dirPath = SubAllRoot + dirList[i];
var fileList = Utils.GetFiles(dirPath, "*", SearchOption.AllDirectories);
foreach (string filePath in fileList)
{
resList.Add(filePath.Replace(SubAllRoot, ""));
}
}
return resList;
}
//合并fls.dir
private static System.Collections.Generic.HashSet<string> combineFlsDir(System.Collections.Generic.HashSet<string> allRes,
string flsDirFile, ref int count, ref long size)
{
var resList = readFlsDir(flsDirFile);
for (int i = 0; i < resList.Count; ++i)
{
if (!allRes.Contains(resList[i]))
{
string subResPath = SubAllRoot + resList[i];
//GameCfgData文件要区分语言
if (resList[i].IndexOf("GameCfgData") >= 0 && resList[i].IndexOf("GameCfgData_" + _lanStr) == -1)
{
continue;
}
if (File.Exists(subResPath))
{
count++;
size += new FileInfo(subResPath).Length;
}
allRes.Add(resList[i]);
}
}
return allRes;
}
//合并fls.fls
private static System.Collections.Generic.HashSet<string> combineFlsFile(System.Collections.Generic.HashSet<string> allRes,
string flsFile, ref int count, ref long size)
{
string[] defaultResArray = null;
//默认存在的fls文件用来和sceneFile里面场景对应资源进行合并
if (File.Exists(flsFile))
{
defaultResArray = File.ReadAllLines(flsFile);
}
//合并默认内容
if (defaultResArray != null && defaultResArray.Length > 0)
{
//合并size和count其实这个不准
string tagLine = defaultResArray[0];
string[] sizeAndCountArray = tagLine.Split(',');
count += int.Parse(sizeAndCountArray[0].Trim());
size += long.Parse(sizeAndCountArray[1].Trim());
//合并资源列表
for (int i = 1; i < defaultResArray.Length; ++i)
{
if (!allRes.Contains(defaultResArray[i]))
{
allRes.Add(defaultResArray[i]);
}
}
}
return allRes;
}
//去重资源列表计算count和size
private static System.Collections.Generic.HashSet<string> optimizeList(List<string> sceneResList, out int count, out long size)
{
count = 0;
size = 0;
System.Collections.Generic.HashSet<string> allRes = new System.Collections.Generic.HashSet<string>();
for (int i = 0; i < sceneResList.Count; ++i)
{
//去重
if (!string.IsNullOrEmpty(sceneResList[i]) && !allRes.Contains(sceneResList[i]))
{
string subResPath = SubAllRoot + sceneResList[i];
if (File.Exists(subResPath))
{
size += (new FileInfo(subResPath)).Length;
count++;
}
else
{
UnityEngine.Debug.LogError("自动分FLS 文件不存在 " + sceneResList[i]);
}
allRes.Add(sceneResList[i]);
}
}
return allRes;
}
private static List<string> addDependenceRes(string mapIdStr)
{
int id = 0;
if (int.TryParse(mapIdStr, out id))
{
return addDependenceRes(id);
}
return new List<string>();
}
private static List<string> addDependenceRes(int mapID)
{
DeclareMapsetting mapSetting = DeclareMapsetting.Get(mapID);
if (mapSetting == null)
{
UnityEngine.Debug.LogError("地图id没找到 " + mapID);
return new List<string>();
}
string sceneName = mapSetting.LevelName;
string sceneMusic = mapSetting.Music;
var mapInfoData = MapInfoDataReader.LoadSceneObjectData(getResourcePath("MapInfo"), mapSetting.MapInfo);
UnityEngine.Debug.Log("collect scene:" + sceneName);
var monsterResList = new List<string>();
var npcResList = new List<string>();
if (mapInfoData != null)
{
EditorUtility.DisplayProgressBar("生成FLS文件", "收集怪物资源", 0.5f);
//怪物monster
var monsterList = mapInfoData.mapMonsterStubs;
List<int> monsterIDList = new List<int>();
for (int i = 0; i < monsterList.Count; ++i)
{
int monsterID = monsterList[i].m_id;
if (monsterIDList.Contains(monsterID))
{
continue;
}
monsterIDList.Add(monsterID);
}
monsterResList = collectMonsterRes(monsterIDList);
UnityEngine.Debug.Log("monsterResList " + monsterResList.Count);
//---
EditorUtility.DisplayProgressBar("生成FLS文件", "收集NPC资源", 0.5f);
//NPC
var npcDataList = mapInfoData.mapNpcStubs;
List<int> npcIDList = new List<int>();
for (int i = 0; i < npcDataList.Count; ++i)
{
int npcID = npcDataList[i].m_id;
if (npcIDList.Contains(npcID))
{
continue;
}
npcIDList.Add(npcID);
}
npcResList = collectNPCRes(npcIDList);
UnityEngine.Debug.Log("npcResList " + npcResList.Count);
//---
}
EditorUtility.DisplayProgressBar("生成FLS文件", "收集副本资源", 0.5f);
//cloneMap
var cloneMaps = collectCloneMapID(mapID);
var cloneResList = collectCloneMonster(cloneMaps);
UnityEngine.Debug.Log("cloneResList " + cloneResList.Count);
//---
EditorUtility.DisplayProgressBar("生成FLS文件", "收集关联动作资源", 0.5f);
//怪物关联的动作资源
List<string> animList = new List<string>();
animList.AddRange(collectMonsterAnim(monsterResList));
animList.AddRange(collectMonsterAnim(npcResList));
animList.AddRange(collectMonsterAnim(cloneResList));
//---
List<string> allDependenceResList = new List<string>();
allDependenceResList.Add(string.Format("{0}Scene/{1}.unity3d", _assetRoot, sceneName));
string music = string.Format("{0}Sound/Music/{1}.mp3", _assetRoot, sceneMusic);
if(File.Exists(music))
allDependenceResList.Add(music);
string miniMap = string.Format("{0}Texture/Map/tex_{1}.jpg", _assetRoot, sceneName);
if (File.Exists(miniMap))
allDependenceResList.Add(miniMap);
allDependenceResList.AddRange(monsterResList);
allDependenceResList.AddRange(npcResList);
allDependenceResList.AddRange(cloneResList);
allDependenceResList.AddRange(animList);
return allDependenceResList;
}
//保存文件
private static void save(params List<string>[] args)
{
int count = 0;
System.Collections.Generic.HashSet<string> allRes = new System.Collections.Generic.HashSet<string>();
for (int i = 0; i < args.Length; ++i)
{
for (int m = 0; m < args[i].Count; ++m)
{
//去重
if (!allRes.Contains(args[i][m]))
{
allRes.Add(args[i][m]);
count++;
}
}
}
string flsLanDir = SubFlsRoot + _lanStr;
if (!Directory.Exists(flsLanDir))
{
Directory.CreateDirectory(flsLanDir);
}
StreamWriter sw = new StreamWriter(SubFlsRoot + _lanStr + "/test.txt");
sw.WriteLine(string.Format("{0},0", count));
var itor = allRes.GetEnumerator();
while (itor.MoveNext())
{
sw.WriteLine(itor.Current);
}
sw.Close();
}
//怪物模型
private static List<string> collectMonsterRes(List<int> monsterIDs)
{
List<string> monsterPaths= new List<string>();
for (int i = 0; i < monsterIDs.Count; ++i)
{
string path = collectMonsterRes(monsterIDs[i]);
if (!string.IsNullOrEmpty(path))
{
monsterPaths.Add(path);
}
}
return monsterPaths;
}
private static string collectMonsterRes(int monsterID)
{
var monsterCfg = DeclareMonster.Get(monsterID);
if (monsterCfg == null)
{
return "";
}
var modelConfig = DeclareModelConfig.Get(monsterCfg.Res);
if (modelConfig == null)
{
return "";
}
return combineMonsterPath(modelConfig.Model);
}
//npc模型和音效
private static List<string> collectNPCRes(List<int> npcIDs)
{
List<string> npcPaths = new List<string>();
List<string> speechPath = new List<string>();
for (int i = 0; i < npcIDs.Count; ++i)
{
var npcCfg = DeclareNpc.Get(npcIDs[i]);
if (npcCfg == null)
{
continue;
}
var modelConfig = DeclareModelConfig.Get(npcCfg.Res);
if (modelConfig != null)
{
npcPaths.Add(combineNPCPath(modelConfig.Model));
}
string speechName = npcCfg.Speech;
if (string.IsNullOrEmpty(speechName))
{
continue;
}
speechPath.Add(combineNpcSpeechRes(speechName));
}
npcPaths.AddRange(speechPath);
return npcPaths;
}
//通过副本数据获取副本中怪物信息CloneMonster
private static List<string> collectCloneMonster(List<DeclareCloneMap> cloneMapData)
{
List<int> monsterIDList = new List<int>();
List<string> monsterPathList = new List<string>();
//for (int i = 0; i < cloneMapData.Count; ++i)
//{
// int cloneMapId = cloneMapData[i].Id;
// var cloneMonsterDataItor = DeclareCloneMonster.CacheData.GetEnumerator();
// while (cloneMonsterDataItor.MoveNext())
// {
// var current = cloneMonsterDataItor.Current.Value;
// if (current.CloneID == cloneMapId)
// {
// //怪物信息monster_information解析出id
// string[] monsterIDArray = current.MonsterInformation.Split(';');
// for (int m = 0; m < monsterIDArray.Length; ++m)
// {
// string monsterIDstr = monsterIDArray[m].Substring(0, monsterIDArray[m].IndexOf('_'));
// int monsterID = getInt(monsterIDstr);
// if (!monsterIDList.Contains(monsterID))
// {
// monsterIDList.Add(monsterID);
// string path = collectMonsterRes(monsterID);
// if (!string.IsNullOrEmpty(path) && !monsterPathList.Contains(path))
// {
// monsterPathList.Add(path);
// }
// }
// }
// }
// }
//}
return monsterPathList;
}
//通过地图id获取副本数据
private static List<DeclareCloneMap> collectCloneMapID(int mapID)
{
List<DeclareCloneMap> cloneMapDataList = new List<DeclareCloneMap>();
DeclareCloneMap.Foreach((cfg) =>
{
if (mapID == cfg.Mapid)
{
cloneMapDataList.Add(cfg);
return false;
}
return true;
});
return cloneMapDataList;
}
//通过怪物名字来获取对应的怪物动作文件
private static List<string> collectMonsterAnim(string monsterPath)
{
List<string> animFileList = new List<string>();
string monsterDirName = Path.GetFileNameWithoutExtension(monsterPath);
string animRootPath = _subResRoot + "Animation/monster/" + monsterDirName;
if (Directory.Exists(animRootPath))
{
animFileList = Utils.GetFiles(animRootPath, "*.*", SearchOption.AllDirectories, PkgConstDefine.CommonExceptionEx);
}
for (int i = 0; i < animFileList.Count; ++i)
{
animFileList[i] = Path.ChangeExtension(animFileList[i].Replace(SubAllRoot, ""), "unity3d");
}
return animFileList;
}
private static List<string> collectMonsterAnim(List<string> monsterList)
{
List<string> animList = new List<string>();
for (int i = 0; i < monsterList.Count; ++i)
{
animList.AddRange(collectMonsterAnim(monsterList[i]));
}
return animList;
}
//组合怪物路径
private static string combineMonsterPath(int id)
{
string monsterPrefabName = string.Format("m_{0:D3}.unity3d", id);
string assetsPath = getResourcePath(string.Format("Prefab/Monster/{0}", monsterPrefabName));
return assetsPath;
}
//NPC资源路径
private static string combineNPCPath(int id)
{
return combineMonsterPath(id);
}
//NPC音效文件
private static string combineNpcSpeechRes(string speechName)
{
string lan = _lanStr;
if (_lanStr.IndexOf("/") > 0)
{
lan = _lanStr.Substring(0, _lanStr.IndexOf("/"));
}
//音效有语言路径
return getResourcePath(string.Format("Sound/Speech/{1}/{0}.unity3d", speechName, lan));
}
private static string getResourcePath(string resDirName)
{
return _assetRoot + resDirName;
}
private static int getInt(string intStr)
{
int ret = 0;
int.TryParse(intStr, out ret);
return ret;
}
#region
public static void CreateBinaryRes(string binaryFileName, out List<string> binaryResList)
{
#if UNITY_STANDALONE_WIN
string resStoreDir = "../SubResource/EXE";
#else
string resStoreDir = "../SubResource/APK";
#endif
if (!Directory.Exists(resStoreDir))
Directory.CreateDirectory(resStoreDir);
binaryFileName = resStoreDir + "/" + binaryFileName;
binaryResList = new List<string>();
List<string> flsList = Utils.GetFiles(SubFlsRoot, "*.fls", SearchOption.TopDirectoryOnly, PkgConstDefine.CommonExceptionEx);
int index = 1;
for (int i = 0; i < flsList.Count; ++i)
{
if (flsList[i].IndexOf("fls0") > 0 || flsList[i].IndexOf("fls.fls") > 0)
continue;
string binaryResPath = binaryFileName + "_" + (index);
binaryResList.Add(binaryResPath);
CreateBinaryResAndMapFile(flsList[i], binaryResPath);
index++;
}
EditorUtility.ClearProgressBar();
}
public static bool CreateBinaryResAndMapFile(string flsFile, string outMapFile)
{
bool retValue = true;
string outFileMap = outMapFile + ".map";
string outFileRes = outMapFile;
FileStream writerRes = new FileStream(outFileRes, FileMode.Create);
FileStream writerMap = new FileStream(outFileMap, FileMode.Create);
try
{
string readLine = "";
StreamReader reader = File.OpenText(flsFile);
long begin = 0;
long end = 0;
int dirLen = 0;
int nameLen = 0;
int md5Len = 0;
long fileSize = 0;
string dir = "";
string name = "";
string md5 = "";
string originalPath = "";
int count = 0;
int maxCount = 0;
bool hasMaxCount = false;
while ((readLine = reader.ReadLine()) != null)
{
//不拷贝视频文件
if (readLine.IndexOf(".map4") > 0)
continue;
if (readLine.Contains(","))
{
string countStr = readLine.Substring(0, readLine.IndexOf(",")).Trim();
hasMaxCount = Int32.TryParse(countStr, out maxCount);
continue;
}
if (maxCount != 0)
EditorUtility.DisplayProgressBar("生成分段资源", readLine, count / (float)maxCount);
originalPath = SubAllRoot + readLine;
//begin_end_dirLen_nameLen_md5Len_fileSize_dir_name_md5
FileInfo fileInfo = new FileInfo(originalPath);
if (!fileInfo.Exists)
{
//retValue = false;
UnityEngine.Debug.LogError("WARN::" + fileInfo.FullName + " ----> 不存在!!!");
continue;
}
if (retValue == false)
{
continue;
}
fileSize = fileInfo.Length;
begin = end;
//readLine = g_form.g_configModel.m_addDir + readLine;
dirLen = getDirOrNameLen(readLine, true);
nameLen = getDirOrNameLen(readLine, false);
md5Len = 32;
end += fileSize + dirLen + nameLen + md5Len + 32 * 4;
dir = getDirOrNameStr(readLine, true);
name = getDirOrNameStr(readLine, false);
md5 = Utils.MD5(fileInfo.FullName);
//write map file
writerMap.Write(getByte("" + begin, 10), 0, 10);
writerMap.Write(getByte("" + end, 10), 0, 10);
writerMap.Write(getByte("" + dirLen, 10), 0, 10);
writerMap.Write(getByte("" + nameLen, 10), 0, 10);
writerMap.Write(getByte("" + md5Len, 10), 0, 10);
writerMap.Write(getByte("" + fileSize, 10), 0, 10);
writerMap.Write(getByte(dir), 0, getByte(dir).Length);
writerMap.Write(getByte(name), 0, getByte(name).Length);
writerMap.Write(getByte(md5), 0, getByte(md5).Length);
//---
//write res file
writerRes.Write(getByte("" + dirLen, 32), 0, 32);
writerRes.Write(getByte("" + nameLen, 32), 0, 32);
writerRes.Write(getByte("" + md5Len, 32), 0, 32);
writerRes.Write(getByte("" + fileSize, 32), 0, 32);
writerRes.Write(getByte(dir), 0, getByte(dir).Length);
writerRes.Write(getByte(name), 0, getByte(name).Length);
writerRes.Write(getByte(md5), 0, getByte(md5).Length);
writeFile(writerRes, originalPath);
//---
count++;
}
reader.Close();
}
catch (System.Exception)
{
retValue = false;
}
finally
{
writerMap.Flush();
writerMap.Close();
writerRes.Flush();
writerRes.Close();
}
return retValue;
}
private static int getDirOrNameLen(string abPath, bool forDir)
{
string newPath = abPath.Replace("\\", "/");
int dirRange = newPath.LastIndexOf("/");
string dir = newPath.Substring(0, dirRange + 1);
string name = newPath.Substring(dirRange + 1, newPath.Length - dirRange - 1);
if (forDir)
{
return dir.Length;
}
return name.Length;
}
private static string getDirOrNameStr(string abPath, bool forDir)
{
string newPath = abPath.Replace("\\", "/");
int dirRange = newPath.LastIndexOf("/");
string dir = newPath.Substring(0, dirRange + 1);
string name = newPath.Substring(dirRange + 1, newPath.Length - dirRange - 1);
if (forDir)
{
return dir;
}
return name;
}
private static Byte[] getByte(string value, int len)
{
Byte[] bytes = new Byte[len];
Byte[] tempBts = Encoding.Default.GetBytes(value);
for (int i = 0; i < tempBts.Length; ++i)
{
if (i > len)
{
break;
}
bytes[i] = tempBts[i];
}
return bytes;
}
private static Byte[] getByte(string value)
{
return Encoding.Default.GetBytes(value);
}
private static void writeFile(FileStream writer, string file)
{
FileStream read = new FileStream(file, FileMode.Open);
Byte[] buffer = new Byte[1024];
int len = 0;
while ((len = read.Read(buffer, 0, 1024)) > 0)
{
writer.Write(buffer, 0, len);
}
read.Close();
}
#endregion
}
}