合并文件夹二

来源:互联网 发布:清朗网络 青年力量海报 编辑:程序博客网 时间: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;        }
原创粉丝点击