//文件夹匹配:对比文件夹,相同的目录结构、所有文件名称小写相同,制定文件外的MD5值相同 ,则两个文件夹匹配成功!

        /// <summary>
/// 批量匹配书籍H5资源包
/// </summary>
/// <param name="strPlateDirPath">平台书籍H5资源所在路径</param>
/// <param name="strSourDirPath">原加工书籍包所在路径</param>
private void MultiMatchBookH5Res(string strPlateDirPath, string strSourDirPath)
{
//所有平台书籍包路径集
string[] arryPlateDir = Directory.GetDirectories(strPlateDirPath);
//所有加工书籍包路径集
string[] arrySourDir = Directory.GetDirectories(strSourDirPath);
//遍历匹配 平台和原加工 书籍包
foreach (string plateBookDir in arryPlateDir)
{
foreach (string srcBookDir in arrySourDir)
{
bool isMatch = MatchTextBookH5Reses(plateBookDir, srcBookDir,true);
if (isMatch)
{
break;
}
}
//刷新进度
//mFindSamePackageworker.ReportProgress(nIndex + 1, arryDir.Length);
}
} /// <summary>
/// 匹配书籍文件夹
/// </summary>
/// <param name="plateBookDirPath">平台书籍文件夹路径</param>
/// <param name="srcBookDirPath">原加工书籍文件夹路径</param>
private bool MatchTextBookH5Reses(string plateBookDirPath, string srcBookDirPath,bool isNoMatchReturn = false)
{
bool isMatch = false;
try
{
//平台书籍H5资源文件夹路径集
string[] arryPlateBookResPath = Directory.GetDirectories(plateBookDirPath);
//原加工书籍H5资源文件夹路径集
string[] arrySrcBookResPath = Directory.GetDirectories(srcBookDirPath); // 1: 判断H5资源数量是否相等
int plateBookResesCount = arryPlateBookResPath.Count();
int srcBookResesCount = arrySrcBookResPath.Count();
//if (plateBookResesCount != srcBookResesCount)
//{
// //MessageBox.Show("平台书籍H5资源数量与原加工书籍H5资源数量不相等!");
// return isMatch;
//}
mDicMatchH5Res.Clear();
string SaveInfo = "平台书籍H5资源数量:" + plateBookResesCount;
SaveInfo += "\r\n";
SaveInfo += "原加工书籍H5资源数量 : " + srcBookResesCount; //2:H5资源是否全匹配
foreach (string plateBookResPath in arryPlateBookResPath)
{
foreach (string srcBookResPath in arrySrcBookResPath)
{
// 1): 判断H5资源子文件夹目录是否全匹配
isMatch = MatchH5ResDir(plateBookResPath, srcBookResPath);
if(isMatch)
{
//SaveInfo += "\r\n";
//SaveInfo += SaveInfo += plateBookResPath + " 目录匹配: " + srcBookResPath; //"平台书籍H5资源目录结构与原加工书籍H5资源目录结构相同 ";
// 2): 判断H5资源子文件是否全匹配
isMatch = MatchH5Reses(plateBookResPath, srcBookResPath);
if(isMatch)
{
SaveInfo += "\r\n";
SaveInfo += plateBookResPath+ " 匹配: " + srcBookResPath;
mDicMatchH5Res.Add(plateBookResPath,srcBookResPath);
break;
}
} }
if (!isMatch) //平台任意一H5资源未匹配到该原加工书籍H5则正本书不匹配
{
mDicMatchH5Res.Add(plateBookResPath, string.Empty);
SaveInfo += "\r\n";
SaveInfo += plateBookResPath + " 匹配: " + string.Empty;
if (isNoMatchReturn)
{
return isMatch; //单个H5资源匹配失败直接返回
}
}
}
// 3:H5资源一对一匹配
int srcMatchH5ResCount = mDicMatchH5Res.Values.Count();
List<string> lstSrcMathcH5Res = new List<string>();
lstSrcMathcH5Res.AddRange(mDicMatchH5Res.Values);
int srcMatchH5ResDistinctCount = lstSrcMathcH5Res.Distinct().Count();
SaveInfo += "\r\n";
int count = srcMatchH5ResCount - srcMatchH5ResDistinctCount;
SaveInfo += "资源匹配重复数量: " + count;
if(srcMatchH5ResCount != srcMatchH5ResDistinctCount)
{
MessageBox.Show("平台书籍H5资源匹配原加工书籍H5资源重复!");
} //将匹配信息输出到文件夹
DirectoryInfo dirInfo = new DirectoryInfo(plateBookDirPath);
string fileName = dirInfo.Name + ".txt";
string filePath = Path.GetDirectoryName(plateBookDirPath);
string fullName = Path.Combine(filePath, fileName);
SaveContentToFile(SaveInfo, fullName); // 4:同步为原加工书籍H5资源文件名称 }
catch (Exception ex)
{
isMatch = false;
}
return isMatch;
} /// <summary>
/// 匹配H5资源目录结构
/// </summary>
/// <param name="plateBookResPath">平台书籍文件夹</param>
/// <param name="srcBookResPath">原加工书籍文件夹</param>
private bool MatchH5ResDir(string plateBookResPath, string srcBookResPath)
{
bool isMatch = false;
try
{
//平台书籍H5资源子文件夹路径集
string[] arryPlateH5ResPath = Directory.GetDirectories(plateBookResPath);
var arryPlateH5ResDir = arryPlateH5ResPath.Select(o => o.Replace(plateBookResPath, string.Empty));
List<string> lstPlateH5ResDir = new List<string>();
lstPlateH5ResDir.AddRange(arryPlateH5ResDir);
//原加工书籍H5资源子文件夹路径集
string[] arrySrcH5ResPath = Directory.GetDirectories(srcBookResPath);
var arrySrcH5ResDir = arrySrcH5ResPath.Select(o => o.Replace(srcBookResPath, string.Empty));
List<string> lstSrcH5ResDir = new List<string>();
lstSrcH5ResDir.AddRange(arrySrcH5ResDir);
var lstSameBookResDir = lstPlateH5ResDir.Intersect(lstSrcH5ResDir);
int plateH5ResDirCount = lstPlateH5ResDir.Count();
int sameH5ResesCount = lstSameBookResDir.Count();
if (sameH5ResesCount == plateH5ResDirCount)
{
isMatch = true;
}
}
catch (Exception ex)
{
isMatch = false;
}
return isMatch;
} /// <summary>
/// 匹配H5资源
/// </summary>
/// <param name="plateBookResPath">平台书籍文件夹</param>
/// <param name="srcBookResPath">原加工书籍文件夹</param>
private bool MatchH5Reses(string plateBookResPath, string srcBookResPath)
{
bool isMatch = false;
try
{
//平台书籍H5资源子文件路径集
List<string> lstPlateH5ResFile = GetDirAllFiles(plateBookResPath,true); //解决H5资源内子文件同名问题
var lstPlateH5ResPathFile = lstPlateH5ResFile.Select(o => o.Replace(plateBookResPath, string.Empty).ToLower());
//原加工书籍H5资源子文件夹路径集
List<string> lstSrcH5ResFile = GetDirAllFiles(srcBookResPath, true); //包含:easeljs-0.8.2.min.js 公共控件 、 *.ttf等文件
var lstSrcH5ResPathFile = lstSrcH5ResFile.Select(o => o.Replace(srcBookResPath, string.Empty).ToLower());
var lstSameH5ResPathFile = lstPlateH5ResPathFile.Intersect(lstSrcH5ResPathFile);
int plateH5ResFilesCount = lstPlateH5ResPathFile.Count();
int sameH5ResFilesCount = lstSameH5ResPathFile.Count();
if (sameH5ResFilesCount == plateH5ResFilesCount)
{
foreach(string pathFile in lstSameH5ResPathFile)
{
if(pathFile.EndsWith(".html") || pathFile.EndsWith(".db"))
{
continue;
}
string plateFile = plateBookResPath + pathFile;
string srcFile = srcBookResPath + pathFile;
string plateFileMd5 = mMd5Oper.GetFileMd5Value(plateFile);
string srcFileMd5 = mMd5Oper.GetFileMd5Value(srcFile);
if(plateFileMd5 != srcFileMd5 || plateFileMd5 == null || srcFileMd5 == null )
{
isMatch = false;
return isMatch;
}
}
isMatch = true;
}
}
catch (Exception ex)
{
isMatch = false;
}
return isMatch;
} /// <summary>
/// 同步书籍H5资源内文件名称
/// </summary>
/// <param name="plateBookDirPath">平台书籍文件夹路径</param>
/// <param name="srcBookDirPath">原加工书籍文件夹路径</param>
private bool SyncBookH5ResesName(string plateBookDirPath, string srcBookDirPath)
{
bool isSucess = false;
try
{ //单个书籍匹配
bool isMatch = MatchTextBookH5Reses(plateBookDirPath, srcBookDirPath);
//如果匹配则修改匹配的书籍名称为原始文件名称
if (isMatch)
{
//文件夹名称修改为原始文件夹名称(平台H5内文件夹名称=原始H5内文件夹名称)--不做修改
//文件名称修改为原始文件名称(平台H5内文件名称=原始H5内文件名称)
foreach (var dicItem in mDicMatchH5Res)
{
bool isSuccess = SyncH5FilesName(dicItem.Key, dicItem.Value);
if(isSuccess)
{
EncryptZipBookH5Res(dicItem.Key);
}
}
}
}
catch (Exception ex)
{
isSucess = false;
}
return isSucess;
} /// <summary>
/// 同步H5资源名称
/// </summary>
/// <param name="plateH5ResPath">平台H5文件夹</param>
/// <param name="srcH5ResPath">原加工H5文件夹</param>
private bool SyncH5FilesName(string plateH5ResPath, string srcH5ResPath)
{
bool isMatch = false;
try
{
//平台书籍H5资源子文件路径集
List<string> lstPlateH5ResFile = GetDirAllFiles(plateH5ResPath, true); //解决H5资源内子文件同名问题
var lstPlateH5ResPathFile = lstPlateH5ResFile.Select(o => o.Replace(plateH5ResPath, string.Empty).ToLower());
//原加工书籍H5资源子文件夹路径集
List<string> lstSrcH5ResFile = GetDirAllFiles(srcH5ResPath, true); //包含:easeljs-0.8.2.min.js 公共控件 、 *.ttf等文件
var lstSrcH5ResPathFile = lstSrcH5ResFile.Select(o => o.Replace(srcH5ResPath, string.Empty).ToLower());
var lstSameH5ResPathFile = lstPlateH5ResPathFile.Intersect(lstSrcH5ResPathFile);
int plateH5ResFilesCount = lstPlateH5ResPathFile.Count();
int sameH5ResFilesCount = lstSameH5ResPathFile.Count();
if (sameH5ResFilesCount == plateH5ResFilesCount) //为预防不是匹配的文件夹 为安全所以又重新匹配了下
{
foreach (string pathFile in lstSameH5ResPathFile) //修改名称包含 .html .db 不需要H5完全匹配 因为是在匹配完毕的前提下同步的名称
{
string plateFile = plateH5ResPath + pathFile;
string srcSameFile = srcH5ResPath + pathFile;
FileInfo plateH5Info = new FileInfo(plateFile);
foreach(string srcFile in lstSrcH5ResFile)
{
string lowerSrcFile = srcFile.ToLower();
string lowerSameFile = srcSameFile.ToLower();
if (lowerSrcFile == lowerSameFile)
{
string fileName = Path.GetFileName(srcFile);
string plateNewFile = plateFile.Replace(plateH5Info.Name,fileName);
plateH5Info.MoveTo(plateNewFile); //直接修改名称
}
}
}
isMatch = true;
}
}
catch (Exception ex)
{
isMatch = false;
}
return isMatch;
} /// <summary>
/// 加密、压缩书籍内的H5资源包
/// </summary>
private void EncryptZipBookH5Reses(string plateBookDirPath)
{
DirectoryInfo dirInfo = new DirectoryInfo(plateBookDirPath);
if(dirInfo.Exists)
{
DirectoryInfo[] arryH5ResDirInfo = dirInfo.GetDirectories();
foreach (var dirInfoItem in arryH5ResDirInfo)
{
EncryptZipBookH5Res(dirInfoItem.FullName);
}
}
} /// <summary>
/// 加密、压缩H5资源包
/// </summary>
private bool EncryptZipBookH5Res(string h5ResDirPath)
{
bool isSucess = false;
try
{
DirectoryInfo dirInfo = new DirectoryInfo(h5ResDirPath);
if (dirInfo.Exists)
{
string dirName = dirInfo.Name;
string dirParentPath = Path.GetDirectoryName(h5ResDirPath);
string zipPath = Path.Combine(dirParentPath, "zip");
string zipFile = Path.Combine(zipPath, dirName) + ".zip";
string ppubPath = Path.Combine(dirParentPath, "ppub");
string ppubFile = Path.Combine(ppubPath, dirName) + ".ppub";
DirectoryInfo zipDirInfo = new DirectoryInfo(zipPath);
if(!zipDirInfo.Exists)
{
zipDirInfo.Create();
}
mZipOper.CreateZipFile(h5ResDirPath, zipFile);
DirectoryInfo ppubDirInfo = new DirectoryInfo(ppubPath);
if (!ppubDirInfo.Exists)
{
ppubDirInfo.Create();
}
mEncryOper.FileEncrypt(zipFile, ppubFile);
isSucess = true;
}
}
catch (Exception ex)
{
isSucess = false;
}
return isSucess;
}

//文件 操作

        /// <summary>
/// 内容保存至本地文件
/// </summary>
/// <param name="strContent"></param>
/// <param name="fileFullName"></param>
/// <returns></returns>
public bool SaveContentToFile(string strContent, string fileFullName)
{
bool isSuccess = false;
try
{
FileInfo fInfo = new FileInfo(fileFullName);
if (fInfo.Exists)
{
fInfo.Delete();
}
DirectoryInfo dirInfo = fInfo.Directory;
if (!dirInfo.Exists)
{
dirInfo.Create();
}
StreamWriter sw = fInfo.CreateText();
sw.Write(strContent);
sw.Flush();
sw.Close();
isSuccess = true;
}
catch (Exception ex)
{
MessageBox.Show("SaveContentToFile : " + ex.Message);
}
return isSuccess;
} /// <summary>
/// 获取指定目录下的子文件名集
/// </summary>
/// <param name="parentDirPath">指定目录</param>
/// <returns>子目录名集</returns>
private List<string> GetDirAllFiles(string parentDirPath, bool isFullName = false)
{
List<string> listFiles = new List<string>();
DirectoryInfo folder = new DirectoryInfo(parentDirPath.Trim()); //指定搜索文件夹
if (folder.Exists)//存在 文件夹
{
FileInfo[] listFileInfos = folder.GetFiles();//取得给定文件夹下的文件夹组
if (listFiles != null)
{
foreach (FileInfo fileInfo in listFileInfos)//遍历
{
if (isFullName)
{
listFiles.Add(fileInfo.FullName);
}
else
{
listFiles.Add(fileInfo.Name);
}
}
}
DirectoryInfo[] childDirInfos = folder.GetDirectories(); //子目录
foreach (DirectoryInfo dirInfo in childDirInfos)
{
listFiles.AddRange(GetDirAllFiles(dirInfo.FullName, isFullName));
}
}
return listFiles;
}

C#:文件夹匹配的更多相关文章

  1. Java递归搜索指定文件夹下的匹配文件

    import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Queue; /** ...

  2. Android屏幕适配-资源文件夹命名与匹配规则

    说明:本文档目的为分析android工程res目录下的资源文件夹(drawable,values,layout等)在屏幕适配方面的限定与适配方法. 1. Res下文件夹命名方式 1. 可用的命名属性 ...

  3. linux 下正则匹配时间命名格式的文件夹

    用正则表达式匹配时间格式命名的文件夹 ls mypath | grep -E "[0-9]{4}-[0-9]{1,2}" mypath为需要查询的目录 查询出来的文件夹格式为:例 ...

  4. Apache 配置两个域名匹配的文件夹和配置多个Web站点

    Apache的虚拟主机是一种同意在同一台机器上,执行超过一个站点的解决方式,同一时候也就能够邦迪二级域名到指定的文件夹.虚拟主机有两种.一种叫基于IP的(IP-based),还有一种叫基于名字的(na ...

  5. 让Nginx路径中的子目录匹配文件夹的另一种写法

    其实相当于对路径做一种通配符,根据路径名访问相应的文件夹.直接看高潮部分如下.. location /static { root /var/www/usmt; index index.html boa ...

  6. lua使用io.open跨平台文件夹遍历匹配查找

    -- Desc :实现在LUA_PATH中的lua文件中遍历寻找没用到PNG_PATH路径下的png图片,并将其打印出来. -- Date :12:49:28 2014-09-04 1 print(& ...

  7. 【原创】java删除未匹配的文件夹FileFileFilter,FileUtils,删除目录名字不是某个名字的所有文件夹及其子文件夹

    闲着无聊,写了个小程序. 需求: 举例: 比如我的E盘有一个test的目录,test的结构如下: 要求除了包含hello的目录不删除以外,其他的所有文件夹都要删除. 代码如下: package com ...

  8. GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级

    一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...

  9. dll文件32位64位检测工具以及Windows文件夹SysWow64的坑

    自从操作系统升级到64位以后,就要不断的需要面对32位.64位的问题.相信有很多人并不是很清楚32位程序与64位程序的区别,以及Program Files (x86),Program Files的区别 ...

随机推荐

  1. java:从指定问价中读取80个字节写入指定文件中

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class F ...

  2. Mac上c语言连接mysql遇到的问题

    参照<Beginning Linux Programming>上的例程写了一个连接mysql的c语言小程序connect1.c.但是按照书上的编译命令无法编译.然后经过查阅资料解决了问题. ...

  3. Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了

    Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...

  4. BZOJ1260 [CQOI2007]涂色paint 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1260 题意概括 假设你有一条长度为5的木版,初始时没有涂过任何颜色.你希望把它的5个单位长度分别涂 ...

  5. L3-016 二叉搜索树的结构 (30 分) 二叉树

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

  6. 练习题|MySQL

    MySQL主要内容: 1.数据库介绍.类型.特性2.MySQL数据库安装.连接.启动.停止3.表字段类型介绍.主键约束.表创建语句4.常用增删改查语句.分组.聚合5.外键管理.unique字段.表结构 ...

  7. ubuntu安装nodejs出现./config.gypi错误

    报错的内容如下: xxx@xxx [/usr/local/src/node-v0.8.3]# ./configure { 'target_defaults': { 'cflags': [], 'def ...

  8. 【Java并发核心五】Future 和 Callable

    默认情况下,线程Thread对象不具有返回值的功能,如果在需要取得返回值的情况下会极为不方便.jdk1.5中可以使用Future 和 Callable 来获取线程返回值. Callable 可以 看成 ...

  9. Linux/Window 正斜杠 反斜杠

    文件目录结构: Linux 是用正斜杠 目录名区分大小写 Window 是用反斜杠 目录名不区分大小写

  10. 前端性能优化 —— 减少HTTP请求

    简要:对于影响页面呈选 的因素有3个地方:服务器连接数据库并计算返回数据 , http请求以及数据(文件)经过网络传输 , 文件在浏览器中计算渲染呈选: 其中大约80%的时间都耗在了http请求上,所 ...