Files
Main/Assets/Editor/DIY/FLSTool/FlsUtils.cs

894 lines
33 KiB
C#
Raw Permalink Normal View History

2025-01-25 04:38:09 +08:00
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
}
}