合并文件夹二

背景

需要按照一定规则合并大量文件夹
这些文件夹是按照命名分类的
这些文件夹的命名存在一定规律,比如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;
        }
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光下是个孩子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值