迭代文件夹和子文件夹的最佳方法

时间:2011-03-03 13:35:27

标签: c# directory subdirectory

迭代文件夹和子文件夹以获取从指定位置开始的每个文件夹中的文件大小,文件总数和文件夹总大小的最佳方法是什么?

6 个答案:

答案 0 :(得分:43)

如果您使用的是.NET 4,则可能希望使用System.IO.DirectoryInfo.EnumerateDirectoriesSystem.IO.DirectoryInfo.EnumerateFiles方法。如果您使用其他帖子推荐的Directory.GetFiles方法,则在检索到所有条目之前,方法调用将不会返回。如果使用递归,这可能需要很长时间。

来自documentation

  

EnumerateFilesGetFiles方法的不同之处如下:

     
      
  • 当您使用EnumerateFiles时,您可以在整个集合开始之前开始枚举FileInfo个对象的集合   返回。
  •   
  • 使用GetFiles时,必须等待返回整个FileInfo个对象,然后才能访问该阵列。
  •   
     

因此,当您使用许多文件和目录时,   EnumerateFiles可以提高效率。

答案 1 :(得分:29)

使用Directory.GetFiles()。我相信该页面的底部包含一个完全递归的示例。

答案 2 :(得分:5)

遍历所有目录子文件夹和文件,无论子文件夹和文件有多少。

string [] filenames;
 fname = Directory.GetFiles(jak, "*.*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();

然后从数组你可以通过循环或你想要的东西得到你想要的东西。

答案 3 :(得分:2)

请注意,您需要执行验证检查。

string[] fileNames = Directory.GetFiles("c:\\", "*.*", SearchOption.AllDirectories);
int fileCount = fileNames.Count();
long fileSize = fileNames.Select(file => new FileInfo(file).Length).Sum(); // in bytes

答案 4 :(得分:1)

要遍历文件和文件夹,您通常会使用DirectoryInfoFileInfo类型。 FileInfo类型有一个Length属性,以字节为单位返回文件大小。

我认为你必须编写自己的代码来迭代文件并计算总文件大小,但它应该是一个非常简单的递归函数。

答案 5 :(得分:0)

这是一个使用上面Peter的建议和递归的示例。

using System;
using System.IO;

namespace FileSystemUtils
{
    class Program
    {
        static void Main(string[] args)
        {
            string folderPath = "C:\\docs";

            DirectoryInfo startDir = new DirectoryInfo(folderPath);

            RecurseFileStructure recurseFileStructure = new RecurseFileStructure();
            recurseFileStructure.TraverseDirectory(startDir);
        }

        public class RecurseFileStructure
        {
            public void TraverseDirectory(DirectoryInfo directoryInfo)
            {
                var subdirectories = directoryInfo.EnumerateDirectories();

                foreach (var subdirectory in subdirectories)
                {
                    TraverseDirectory(subdirectory);
                }

                var files = directoryInfo.EnumerateFiles();

                foreach (var file in files)
                {
                    HandleFile(file);
                }
            }

            void HandleFile(FileInfo file)
            {
                Console.WriteLine("{0}", file.Name);
            }
        }
    }
}
相关问题