拆分文件夹

来源:互联网 发布:叶子正品软件 编辑:程序博客网 时间: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);                    }

我在这里把代码都合并了,如果是真正写代码,就传参,然后每一个都可以把功能封装好单独提出来,便于维护~~~