合并文件夹一

来源:互联网 发布: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;        }

小结

用到的算法:递归;

原创粉丝点击