使用 C#.NET 进行文件分隔






4.67/5 (3投票s)
将文件从多个文件夹复制到单个目标
引言
此工具的主要目标是浏览指定的主文件夹及其子目录,分隔文件,并将其复制到用户指定的新目标位置。
背景
C#.NET 和基本的文件操作知识就足够了。
场景
考虑一下这样的场景:您在一个文件夹中拥有多个文件夹,其中有大量的文件,文件类型混杂,例如 .txt、.pdf、.exe、.config、.dll 等。
您非常需要将特定类型的文件放入一个单独的文件夹中。(例如:您想将所有 .pdf 文件从包含许多子目录的目录中收集到一个名为 AllPDFs 的单独文件夹中。)
如果您有我在这里提到的场景,那么这个工具就适合您。该工具将跟踪分布在子目录中的所有文件,并将它们分隔到目标文件夹结构中。
工具说明
屏幕截图
- “源路径”字段将获取源目录路径,并在左侧列表框中列出所选路径中可用的子目录的数量。
- “目标路径”是文件要移动到的目标路径。
- “扩展名”字段将获取要在指定路径中浏览的文件扩展名。
例如:如果您输入 *.dll,那么文件分隔工具将仅查找在指定路径的主目录和子目录中可用的 .dll 文件,并将这些文件单独复制到目标目录中。
附加功能
删除和移动操作作为附加功能提供,您可以使用标记为“附加功能”的组合框打开/关闭该功能。
就像复制操作一样,移动将仅从源中获取提及的扩展名文件并将其移动到目标位置。如果未提供扩展名,则目录中的所有文件都将移动到目标位置。
删除操作会删除源路径中所有与扩展名匹配的文件。如果没有扩展名,将删除源中的所有文件。
Using the Code
getfiles 方法将获取要复制、移动到目标或从源中删除的文件数组。
private string[] GetFiles()
{
string fileName = string.Empty;
string strSourcePath = textBox1.Text;
strTargetPath = textBox2.Text;
string strExtension = !string.IsNullOrEmpty(textBox3.Text) ?
textBox3.Text : "*.*";
string[] files = null;
if (System.IO.Directory.Exists(strSourcePath))
{
files = System.IO.Directory.GetFiles(strSourcePath, strExtension);
string joined = String.Join(", ", files);
files = null;
// Determine if there are any items checked.
if (checkedListBox1.CheckedItems.Count != 0)
{
// If so, loop through all checked items and print results.
string strSubdirectories = "";
string strTempfilelist = "";
for (int x = 0; x < checkedListBox1.CheckedItems.Count; x++)
{
strSubdirectories = checkedListBox1.CheckedItems[x].ToString();
files = System.IO.Directory.GetFiles
(strSubdirectories, strExtension);
strTempfilelist = String.Join(", ", files);
//Concatenating or collecting the filelist
joined += "," + strTempfilelist + ",";
files = null;
strTempfilelist = string.Empty;
}
}
files = joined.Split(',');
}
else
{
MessageBox.Show("Source path does not exist!");
}
return files;
}
GetFiles() 方法分解
以下代码段完成了获取给定路径文件的操作
files = System.IO.Directory.GetFiles(strSourcePath, strExtension);
由于我们可能拥有目录中的目录,因此此数组值有时可能需要扩展,因此我们必须将数组转换为用逗号分隔的字符串值,这样我们就可以遍历可用目录的数量(显然是在列表框中选择的目录),并将文件添加到此数组中。
将数组转换为逗号分隔的 string
由以下代码段完成
- files - 数组值
- String.Join - 将数组转换为带有指定分隔符值的
string
的关键字(这里是逗号 (", ")
string joined = String.Join(", ", files);
由于 getfiles
需要发送一个数组,最终需要以下代码段来执行该活动。
files = joined.Split(',');
现在我们得到了需要删除、移动或复制的值数组,接下来呢?
我们需要一个使用者代码来执行实际的删除、复制、移动操作,不是吗?
所以我编写了用于删除、复制、移动的按钮事件的功能,它们是分开的。
请参阅下面的代码段,以对 getfiles()
方法返回的数组执行复制操作
foreach (string s in files)
{
if (!string.IsNullOrEmpty(s))
{
// Use static Path methods to extract only the file name from the path.
fileName = System.IO.Path.GetFileName(s);
destFile = System.IO.Path.Combine(strTargetPath, fileName);
System.IO.File.Copy(s, destFile, true);
}
}
fileName
- 从源文件中提取文件名destFile
- 将从目标文本框中检索到的目标目录路径与fileName
组合在一起(将目标文件命名为与源文件相同)System.IO.File.Copy(s,destFile,true)
- 从源路径复制文件到目标路径s
- 源文件的完整路径,例如 "D:\C#Books\C#.PDF"destFile
- 选定的目标目录 +fileName
(例如:如果您提到了 "E:\Allpdf",那么路径将是 "E:\Allpdf\C#.PDF"。)
对于循环的每次迭代,都会发生这种情况,最终您将在目标文件夹中分隔特定文件类型。
希望我更好地解释了该工具。
历史
- 2010年10月25日:初始帖子