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