拆分文件夹
来源:互联网 发布:叶子正品软件 编辑:程序博客网 时间:2024/05/29 09:21
背景
需要按照一定规则拆分大量文件夹
这些文件夹是按照命名分类的
这些文件夹的命名存在一定规律,比如:A_001_055,B_002_066,需要把这些文件夹拆分
需求说明
拆分需求说明
1、待拆分文件夹:
规则一:
拆分后
直到分完为止;
规则二:若待分段文件夹为001-007,那么分段后的文件夹也就是001-007,若待分段文件夹为001-008,那么就分为两个文件夹001-005,004-008;
用户指出:文件夹都是从001或者002开始的。
2、在根目录中,可能会有该任务连续的文件夹,如:
若有连续的,就要把连续合并进行分段处理,处理规则,则参考上条“1”;
移动需求说明
1、由于在分段的时候,有重复的文件,如:004和005,
在D1000C2AVI _001_005; D1000C2AVI _004_010;
这两个文件夹中都存在,所以004和005是复制,其他如:001/002/003等都是从待分段文件夹中剪切粘贴到分段文件夹中。
2、待分段文件夹即D1000C2AVI_001_044,中包含5个文件(0_copyfinished; Created; D1000C2AVI_ECEF_AOCS.xml; BJ2_Params.xml; D1000C2AVI_ECI_AOCS.xml) 拷贝到每一个分段文件夹中。这五个文件可能全,可能不全,只要有就拷贝到每一个分段文件夹中
代码
string[] strFiles1 = Directory.GetDirectories(_strOldSegment, "D*_001_*", SearchOption.AllDirectories); string[] strFiles2 = Directory.GetDirectories(_strOldSegment, "D*_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) { if (!Directory.Exists(strSF)) { continue; } List<string> strSFList = new List<string>(); strSFList.Add(strSF); bool isContinue = false; FileInfo fileInfo = new FileInfo(strSF); string strFileMainName = fileInfo.Name; m_Log.Info("获取产品名称"); //产品名称 string productname = strFileMainName.Split('_')[0]; int startnum = Convert.ToInt32(strFileMainName.Split('_')[1].ToString());//起始景001或者002 m_Log.Info("获取起始景"); int Endnumber=0; #region 获得连续的文件夹并放到strSFList集合中 //寻找是否还存在后面连续的文件夹 string[] strContinuity = Directory.GetDirectories(_strOldSegment, string.Format("{0}_*_*", productname), SearchOption.AllDirectories); m_Log.Info("找到所有文件夹,查找符合条件的连续文件夹"); int currentNum = Convert.ToInt32(strFileMainName.Split('_')[2].ToString()); Endnumber = test(strContinuity, currentNum, ref strSFList); m_Log.Info("=====================================>"+currentNum); #endregion m_Log.Info("获得连续文件夹并放到集合中"); string lbltext1 = "正在获取连续文件夹集合"; lblProgressBar.Invoke(new Action<String>(p => { lblProgressBar.Text = p; }), lbltext1); WorkerSegment.ReportProgress(10 * index / list.Count); if (Endnumber <= 4) { dt.Rows.Add(strSF, "不完整"); } if (Endnumber > 5) { List<string> ListIMI = new List<string>(); List<string> ListPaf = new List<string>();//paf集合 #region paf获取 //先获取paf,不论哪个文件夹,只要够这五个,就可以 foreach (string strlist in strSFList) { string[] copyfinished = Directory.GetFiles(strlist, "0_copyfinished", SearchOption.AllDirectories); string[] Created = Directory.GetFiles(strlist, "Created", SearchOption.AllDirectories); string[] ECEFAOCSxml = Directory.GetFiles(strlist, string.Format("{0}_{1}", productname, "ECEF_AOCS.xml"), SearchOption.AllDirectories); string[] ECEFAOCSbak = Directory.GetFiles(strlist, "BJ2_Params.xml", SearchOption.AllDirectories); string[] ECIAOCSxml = Directory.GetFiles(strlist, string.Format("{0}_{1}", productname, "ECI_AOCS.xml"), SearchOption.AllDirectories); ListPaf.AddRange(copyfinished.ToList()); ListPaf.AddRange(Created.ToList()); ListPaf.AddRange(ECEFAOCSxml.ToList()); ListPaf.AddRange(ECEFAOCSbak.ToList()); ListPaf.AddRange(ECIAOCSxml.ToList()); break; } #endregion m_Log.Info("获得paf并放到集合中"); #region IMI获取 isContinue = false; foreach (string strlistSF in strSFList) { List<string> listIMI = new List<string>(); bool IsBreak = false; FileInfo listfile = new FileInfo(strlistSF); string strFileName = listfile.Name; int fileStartnum = Convert.ToInt32(strFileName.Split('_')[1].ToString()); int fileEndnum = Convert.ToInt32(strFileName.Split('_')[2].ToString()); #region 循环imi文件,判断是否完整 int num = fileEndnum - fileStartnum; for (int i = 0; i <= num; i++) { for (int j = 1; j < 5; j++) { string fileStartNum = ""; if ((fileStartnum + i) >= 10) { fileStartNum = "0" + (fileStartnum + i); } else if ((fileStartnum + i) < 10) { fileStartNum = "00" + (fileStartnum + i); } string[] strIMIFiles = Directory.GetFiles(strlistSF, string.Format("{0}_{1}-{2}.IMI", productname, fileStartNum, j), SearchOption.AllDirectories); if (strIMIFiles.Length == 1) { listIMI.AddRange(strIMIFiles.ToList()); //判断是否被占用中 FileStream fs = null; try { foreach (var item in strIMIFiles) { fs = File.Open(item, FileMode.Open, FileAccess.ReadWrite, FileShare.None); fs.Close(); } } catch (IOException ioex) { } } else { IsBreak = true; break; } } if (IsBreak == true) { isContinue = true; break; } } #endregion if (isContinue == true) { dt.Rows.Add(strlistSF,"IMI不完整");//不完整的拐的名称 break; } else { ListIMI.AddRange(listIMI); } } #endregion m_Log.Info("获得imi文件"); //进行剪切 WorkerSegment.ReportProgress(20*index/list.Count);//进度条赋值 string lbltext2 = "正在进行剪切IMI文件"; lblProgressBar.Invoke(new Action<String>(p => { lblProgressBar.Text = p; }), lbltext2); bool blagimi = false; int IMISum = ListIMI.Count; //文件总数 int FileSum = 0; //大类文件数 if (startnum == 2) { if ((IMISum + 1) % 4 != 0) { FileSum = (IMISum + 1) / 4 + 1; } else { FileSum = IMISum / 4; } } else if (startnum == 1) { if (IMISum % 4 != 0) { FileSum = IMISum / 4 + 1; } else { FileSum = IMISum / 4; } } int FolderNum = 0; if (FileSum % 5 >2) { FolderNum = FileSum / 5 + 1; } else { FolderNum = FileSum / 5; } m_Log.Info("开始进行剪切复制"); //动态加载文件夹 //FileSum为最后新建出来的文件夹个数 //int endNum = FileSum; List<string> deleteList = new List<string>(); for (int i = 1; i <= FolderNum; i++) { //进行剪切 List<string> ListCutIMI = new List<string>(); List<string> ListCopyIMI = new List<string>(); int currtInt = 0; int endInt = 0; if (i==1) { //开始从几开始,就写几 currtInt=startnum; } else { //不是开始就需要减一 currtInt = (i-1)*5-1; } if (i == FolderNum) //判断是否为最后一个文件夹 { //是就让数量为最后一个文件的数字 endInt = FileSum; } else { //不是就X5 endInt = i * 5; } //拼接文件夹名称 string strFilename = productname + "_" + string.Format("{0:D3}", currtInt) + "_" + string.Format("{0:D3}", endInt); List<string> OldFilename = new List<string>(); for (int j = currtInt; j <= endInt; j++) { //搜索序号对应小序号文件(_strOldSegment为原路径) //string.Format("{0:D3} ", j)为当前循环的序号 string name = string.Format("{0}_{1}-*", productname, string.Format("{0:D3}", j)); string[] strFiles = Directory.GetFiles(_strOldSegment,name , SearchOption.AllDirectories); foreach (string str in strFiles) { FileInfo FileInfo = new FileInfo(str); string MainName = FileInfo.Directory.FullName; //string path = MainName; if (!OldFilename.Contains(MainName)) { OldFilename.Add(MainName); } } if (endInt-j<2) { //最后两个加入复制列表 ListCopyIMI.AddRange(strFiles.ToList()); } else { //其余在剪切列表 ListCutIMI.AddRange(strFiles.ToList()); } } //剪切imi foreach (string strCutIMI in ListCutIMI) { blagimi = UtilsFile.MoveFile(strCutIMI, _strNewSegment + "\\" + strFilename, true); } m_Log.Info("剪切imi完毕"+ strSF); bool blagcopyimi = false; WorkerSegment.ReportProgress(40 * index / list.Count); string lbltext3 = "正在进行复制IMI文件"; lblProgressBar.Invoke(new Action<String>(p => { lblProgressBar.Text = p; }), lbltext3); //复制imi foreach (string strCopyIMI in ListCopyIMI) { string IMIname = strCopyIMI.Substring(strCopyIMI.LastIndexOf("\\") + 1); blagcopyimi = AT.Data.Json.AsBool(UtilsFile.CopyFile(strCopyIMI, _strNewSegment + "\\" + strFilename + "\\" + IMIname, true), AppConst.Json_Name_Result); } m_Log.Info("复制imi完毕" + strSF); bool blagpaf = false; WorkerSegment.ReportProgress(95 * index / list.Count); string lbltext4 = "正在进行复制paf文件"; lblProgressBar.Invoke(new Action<String>(p => { lblProgressBar.Text = p; }), lbltext4); if (ListPaf.Count == 0) { blagpaf = true; } //复制paf foreach (string strPaf in ListPaf) { string pafname = strPaf.Substring(strPaf.LastIndexOf("\\") + 1); blagpaf = AT.Data.Json.AsBool(UtilsFile.CopyFile(strPaf, _strNewSegment + "\\" + strFilename + "\\" + pafname, true), AppConst.Json_Name_Result); } m_Log.Info("复制paf完毕" + strSF); if (blagimi == true && blagcopyimi==true && blagpaf==true ) { foreach (string oldstr in OldFilename) { if (!deleteList.Contains(oldstr)) { deleteList.Add(oldstr); } } m_Log.Info("删除原文件夹"); } } foreach (string str in deleteList) { DirectoryInfo di = new DirectoryInfo(str); di.Delete(true); }
我在这里把代码都合并了,如果是真正写代码,就传参,然后每一个都可以把功能封装好单独提出来,便于维护~~~
阅读全文
0 0
- 拆分文件夹
- 拆分
- HALCON初步:文件夹遍历,文件筛选,文件名拆分,图片读取及保存
- R语言读取数据、拆分数据,并保存到相应文件夹
- Map拆分List拆分
- 数据库拆分:横向拆分和纵向拆分
- 数据库拆分:横向拆分和纵向拆分
- 拆分字段
- 拆分字符串
- 拆分框架
- 拆分函数
- 拆分字段
- 字符串拆分
- 列拆分
- sdiFrame拆分
- 正整数拆分
- 拆分字符串
- 拆分字符串
- leetcode2 multi_string
- Spring batch教程 之 配置Step
- CI框架 Call to undefined function base_url()解决办法
- PHP接收二进制流并生成文件
- java 日志框架日志系统关系详解
- 拆分文件夹
- InnoDB数据页结构
- STM32学习笔记(5):复位和复位序列(Reset and Reset Sequence)
- Shell脚本8种字符串截取方法总结
- 随机采样方法整理(MCMC、Gibbs Sampling等)
- 前端优化不完全指南
- 网易之小易有一个长度为n序列,小易想移除掉里面的重复元素,但是小易想是对于每种元素保留最后出现的那个
- java大类型转化为小类型
- sqoop1.99.7自定义分隔符