65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (3投票s)

2010年10月25日

CPOL

3分钟阅读

viewsIcon

29739

downloadIcon

633

将文件从多个文件夹复制到单个目标

引言

此工具的主要目标是浏览指定的主文件夹及其子目录,分隔文件,并将其复制到用户指定的新目标位置。

背景

C#.NET 和基本的文件操作知识就足够了。

场景

考虑一下这样的场景:您在一个文件夹中拥有多个文件夹,其中有大量的文件,文件类型混杂,例如 .txt.pdf.exe.config.dll 等。

您非常需要将特定类型的文件放入一个单独的文件夹中。(例如:您想将所有 .pdf 文件从包含许多子目录的目录中收集到一个名为 AllPDFs 的单独文件夹中。)

如果您有我在这里提到的场景,那么这个工具就适合您。该工具将跟踪分布在子目录中的所有文件,并将它们分隔到目标文件夹结构中。

工具说明

屏幕截图

Untitled.png

  1. “源路径”字段将获取源目录路径,并在左侧列表框中列出所选路径中可用的子目录的数量。
  2. “目标路径”是文件要移动到的目标路径。
  3. “扩展名”字段将获取要在指定路径中浏览的文件扩展名。

例如:如果您输入 *.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日:初始帖子
© . All rights reserved.