合并文件夹二
来源:互联网 发布:清朗网络 青年力量海报 编辑:程序博客网 时间:2024/06/05 12:41
背景
需要按照一定规则合并大量文件夹
这些文件夹是按照命名分类的
这些文件夹的命名存在一定规律,比如A_001_005,A_004-010,需要把连续的文件夹合并
需求说明
1、根据指定目录下,找到文件夹所在根目录;该目录下包含需要合并的文件夹
如:
2、将待合并的文件夹,合并到一个主文件夹中;
该合并规则如下:
规则一:
将该三个文件夹合并为一个文件夹:
规则二:
将该两个文件夹合并为一个文件夹:
【注】规则一与二的区别便是:规则一是从001开始,规则二是从004开始。也就是开头并不能确定是从第几景开始的,可能是001或者002或者003……
规则三:
从文件夹名字可以看出:中间缺少了006景数据,那么要合并的文件夹就是
最终结果表示为:
3、将每个文件夹中的
四个文件:copyfinished、created、对应的paf文件进行剪切到合并后文件夹中。
4、全部合并完成后,删除原文件夹
代码
public void GetmergeFiles() { try { string lbltext = ""; labelControl1.Invoke(new Action<String>(p => { labelControl1.Text = p; }), lbltext); DirectoryInfo dir = new DirectoryInfo(_strOldmergeTwo); DirectoryInfo[] folders = dir.GetDirectories(); List<string> type = GetAllTypeFolders(folders); int index = 1; foreach (string item in type) { List<string> subfolders = GetFolderNames(folders, item); List<string> processed = ProcessFolders(_strOldmergeTwo, subfolders, item); while (processed != null) { subfolders = processed; processed = ProcessFolders(_strOldmergeTwo, subfolders, item); } int a = 100 * index / type.Count; Workermerge.ReportProgress(a); index++; //string lbltext1 = "正在处理"; //labelControl1.Invoke(new Action<String>(p => //{ // labelControl1.Text = p; //}), lbltext1); } //string[] strSF = Directory.GetDirectories(_strOldmergeTwo, "D*_*_*", SearchOption.AllDirectories); m_Log.Info("所有文件获取完毕"); } catch (Exception ex) { m_Log.Error(ex); XtraMessageBox.Show("处理失败", "提示", MessageBoxButtons.OK); } } //筛选出所有文件夹的种类 public List<string> GetAllTypeFolders(DirectoryInfo[] folders) { List<string> type = new List<string>(); for (int i = 0; i < folders.Length; i++) { string[] str1 = folders[i].ToString().Split('_'); string firstword = str1[0]; if (!type.Contains(firstword)) { type.Add(firstword); } } return type; } //获取文件夹中包含的特殊字段的文件夹 public List<string> GetFolderNames(DirectoryInfo[] folders, string folder_type) { List<string> folder_name = new List<string>(); for (int i = 0; i < folders.Length; i++) { if (folders[i].Name.Contains(folder_type)) { folder_name.Add(folders[i].Name.ToString()); } } return folder_name; } //处理文件夹 public List<string> ProcessFolders(string root_path, List<string> folders, string folder_type) { List<string> processed_folders = new List<string>(); List<string> serial_folders = new List<string>(); List<string> rest_folders = new List<string>(); //将序列号存到数组中 List<string> order = new List<string>(); foreach (var item_name in folders) { string[] names = item_name.Split('_'); order.Add(names[1]); order.Add(names[2]); } bool serial_flag = true; for (int i = 1; i < order.Count - 1; i = i + 2)//判断偶数位确定是否连续 { int num1 = int.Parse(order[i]) + 1; int num2 = int.Parse(order[i + 1]); if (num1 != num2) { serial_flag = false; for (int j = 0; j < i / 2 + 1; j++) { serial_folders.Add(folders[j]); } MergeFolders(root_path, serial_folders, folder_type); for (int k = i / 2 + 1; k < folders.Count; k++) { rest_folders.Add(folders[k]); } } } if (serial_flag == true) { MergeFolders(root_path, folders, folder_type); processed_folders = null; } else { processed_folders = rest_folders; } return processed_folders; } //合并文件夹 private bool MergeFolders(string root_path, List<string> folders, string folder_type) { bool flag = false; try { //将序列号存到数组中 List<string> order = new List<string>(); foreach (var item_name in folders) { string[] names = item_name.Split('_'); order.Add(names[1]); order.Add(names[2]); } //创建文件夹 string start = order[0].ToString(); string end = order[order.Count - 1].ToString(); string newfolder = folder_type + "_" + start + "_" + end; DirectoryInfo dir = new DirectoryInfo(_strNewmergeTwo); dir.CreateSubdirectory(newfolder); //移动文件 foreach (string item_folder in folders) { DirectoryInfo sub_dir = new DirectoryInfo(root_path + "\\" + item_folder); FileInfo[] file = sub_dir.GetFiles(); for (int i = 0; i < file.Length; i++) { if (!File.Exists(_strNewmergeTwo + "\\" + newfolder + "\\" + file[i])) { File.Move(root_path + "\\" + item_folder + "\\" + file[i], _strNewmergeTwo + "\\" + newfolder + "\\" + file[i]); } } //if (item_folder != newfolder)//避免文件夹为1误删 //{ Directory.Delete(root_path + "\\" + item_folder, true);//删除原文件夹 //} } string lbltext1 = labelControl1.Text + "\n" + newfolder + "处理完毕"; labelControl1.Invoke(new Action<String>(p => { labelControl1.Text = p; }), lbltext1); flag = true; } catch (Exception ex) { m_Log.Error(ex); } return flag; }
阅读全文
0 0
- 合并文件夹二
- Java 多文件夹合并
- linux下合并文件夹
- 合并文件夹下文本
- 【.NET】合并文件夹
- 合并文件夹一
- Java 多文件夹合并
- java 文件夹合并
- 学习(二)C#合并同一文件夹下相同格式的Excel数据
- java 合并文件夹下多个文件
- windows下文件夹合并分割
- Linux下合并覆盖文件夹
- (二)合并排序
- 菜单展开 合并<二>
- Cornerstore分支合并-二
- 石子合并二
- 巧用批处理拷贝合并整个文件夹
- OS X 下 文件夹合并方法
- applicationContext.xml配置hibernate 自动生成表失败
- 第6章 子过程
- fiddler网络调试神器(前端)——擦肩而过
- listview的分页
- 图像处理基本算法-立体视觉
- 合并文件夹二
- StringEscapeUtils类的转义与反转义方法
- 复习Android:笔记(一)工具下载(studio,jdk')和环境配置
- SQL
- 关于RFC 5681和《TCP/IP IIIustrated》在ssthresh(慢开始门限值)调整的区别
- zbar 使用报错
- Python 爬取豆瓣热映电影 (转载)
- mybatis入门
- Class对象的生成方式