合并文件夹一
来源:互联网 发布:python爬虫抓取视频 编辑:程序博客网 时间:2024/06/02 04:45
背景
需要按照一定规则合并大量文件夹
这些文件夹是按照命名分类的
这些文件夹的命名存在一定规律,比如A_001_005,A_004-010,需要把连续的文件夹合并
需求说明
1、根据指定目录下,找到文件夹所在根目录;该目录下包含需要合并的文件夹如:
2、将待合并的文件夹,合并到一个主文件夹中;
例如上图两个文件夹中,任务号相同,将其中的子文件夹都合并到一个主文件夹(TRIPLESAT_1_PMS_20170112_000BAEVI)中
3、其中重复的不合并,即第二个文件夹中的004和005不需要剪切到主文件夹中。
4、全部合并完成后,删除原文件夹
代码
主逻辑代码:
string[] strFiles1 = Directory.GetDirectories(_strOldmerge, "TRIPLESAT_*_001_*", SearchOption.AllDirectories); string[] strFiles2 = Directory.GetDirectories(_strOldmerge, "TRIPLESAT_*_002_*", SearchOption.AllDirectories); List<string> list = new List<string>(); list = strFiles1.ToList(); list.AddRange(strFiles2.ToList()); m_Log.Info("所有001和002开头文件获取完毕"); int index = 1; foreach (string strSF in list) { List<string> strSFList = new List<string>();//文件夹地址集合 strSFList.Add(strSF); FileInfo fileInfo = new FileInfo(strSF); string strFileMainName = fileInfo.Name; m_Log.Info("获取产品名称"); String[] tempStrArray = strFileMainName.Split('_'); //产品名称 string tempName = tempStrArray[0].ToString() + "_";//TRIPLESAT_ tempName += (tempStrArray[1] + "_").ToString();//TRIPLESAT_1_ tempName += (tempStrArray[2] + "_").ToString();//TRIPLESAT_1_PMS_ tempName += (tempStrArray[3] + "_").ToString();//TRIPLESAT_1_PMS_L1_ string NewFileName = tempName + (tempStrArray[4] + "_").ToString();//TRIPLESAT_1_PMS_L1_20170117_ NewFileName += tempStrArray[5].ToString();//TRIPLESAT_1_PMS_L1_20170117_000BD3VI string tempFileName = tempName + (tempStrArray[4]).ToString();//TRIPLESAT_1_PMS_L1_20170117 int startnum = Convert.ToInt32(tempStrArray[6].ToString());//起始景001或者002 int endnum = Convert.ToInt32(tempStrArray[7].ToString()); m_Log.Info("获取起始景,结束景编号"); //labelControl1.Text = "开始处理"+ tempFileName; //获取以该批次的所有文件夹 string[] strFiles = Directory.GetDirectories(_strOldmerge, string.Format("{0}_*_*", NewFileName), SearchOption.AllDirectories); int endNumber = 0; endNumber = GetLastNum(strFiles, endnum, ref strSFList);//最终的结束值 m_Log.Info("此时strSFList包含当前名字相同所有连续的文件夹的地址"); List<string> ListCutFile = new List<string>();//剪切集合 //获取剪切集合 foreach (string item in strSFList) { FileInfo file = new FileInfo(item); string strFileName = file.Name; m_Log.Info("获取产品名称"); String[] tempArray = strFileName.Split('_'); int currtInt = Convert.ToInt32(tempArray[6].ToString()); int endInt = Convert.ToInt32(tempArray[7].ToString()); #region 将符合条件的文件夹添加到ListCutFile中 if (currtInt == startnum) { if (endInt == endNumber) { for (int i = 0; i < endInt; i++) { string[] cutFiles = Directory.GetDirectories(item, string.Format("{0}*_{1}", tempFileName, string.Format("{0:D3}", currtInt + i)), SearchOption.AllDirectories); ListCutFile.AddRange(cutFiles.ToList()); } } else { for (int i = 0; i < endInt - 1; i++) { string[] cutFiles = Directory.GetDirectories(item, string.Format("{0}*_{1}", tempFileName, string.Format("{0:D3}", currtInt + i)), SearchOption.AllDirectories); ListCutFile.AddRange(cutFiles.ToList()); } } } else { if (endInt == endNumber) { for (int i = 1; i < endInt-currtInt+1; i++) { string[] cutFiles = Directory.GetDirectories(item, string.Format("{0}*_{1}", tempFileName, string.Format("{0:D3}", currtInt + i)), SearchOption.AllDirectories); ListCutFile.AddRange(cutFiles.ToList()); } } else { for (int i = 1; i < endInt -currtInt; i++) { string[] cutFiles = Directory.GetDirectories(item, string.Format("{0}*_{1}", tempFileName, string.Format("{0:D3}", currtInt + i)), SearchOption.AllDirectories); ListCutFile.AddRange(cutFiles.ToList()); } } } #endregion } bool blag = true; //剪切到指定位置 foreach (string strCut in ListCutFile) { //strCut最后一个文件夹名字 try { string name = strCut.Substring(strCut.LastIndexOf("\\") + 1); if (!Directory.Exists(_strNewmerge + "\\" + NewFileName)) { Directory.CreateDirectory(_strNewmerge + "\\" + NewFileName); m_Log.Info("创建路径完毕"); } m_Log.Info("准备剪切"+strCut); Directory.Move(strCut, _strNewmerge + "\\" + NewFileName + "\\" + name); } catch (Exception ex) { blag = false; m_Log.Error(ex); } } if (blag == true) { //原文件夹为空,删除文件夹 foreach (string oldstr in strSFList) { DirectoryInfo di = new DirectoryInfo(oldstr); { di.Delete(true); } } }
获取最后一景数目的逻辑代码
private int GetLastNum(string[] strContinuity, int currentNum, ref List<string> strSFList) { currentNum--; for (int i = 0; i < strContinuity.Length; i++) { FileInfo info = new FileInfo(strContinuity[i]); string name = info.Name; String[] tempStrArray = name.Split('_'); int startNum = Convert.ToInt32(tempStrArray[6].ToString()); int endNum = Convert.ToInt32(tempStrArray[7].ToString()); bool hasNext = currentNum == startNum; if (!hasNext) { if (i == strContinuity.Length - 1) { return currentNum + 1; } else { continue; } } else { strSFList.Add(strContinuity[i]); return GetLastNum(strContinuity, endNum, ref strSFList); } } return 0; }
小结
用到的算法:递归;
阅读全文
0 0
- 合并文件夹一
- 一起学shell(一):合并文件夹下所有文件
- Java 多文件夹合并
- linux下合并文件夹
- 合并文件夹下文本
- 【.NET】合并文件夹
- 合并文件夹二
- Java 多文件夹合并
- java 文件夹合并
- java 合并文件夹下多个文件
- windows下文件夹合并分割
- Linux下合并覆盖文件夹
- 数据合并一例
- 石子合并(一)
- 菜单展开 合并<一>
- 石子合并(一)
- 石子合并(一)
- 石子合并(一)
- STM32启动BOOT0 BOOT1设置方法 [
- 解释执行和编译执行的区别、基于栈和基于寄存器的指令集区别
- 文章标题
- CSR8670获取来电号码及开发流程
- apache2: Could not reliably determine the server’s fully qualified domain name 解决方法
- 合并文件夹一
- 交叉验证方法(cross validation procedure)
- java 内存学习 二 (内存溢出情况说明)
- ping工作原理和使用
- python 写一个pyH网页
- tcpdump安装配置及抓包分析
- 统计全排列的结果数目
- MySQL中对varchar类型排序问题的解决
- 组合模式