迭代文件夹和子文件夹以获取从指定位置开始的每个文件夹中的文件大小,文件总数和文件夹总大小的最佳方法是什么?
答案 0 :(得分:43)
如果您使用的是.NET 4,则可能希望使用System.IO.DirectoryInfo.EnumerateDirectories
和System.IO.DirectoryInfo.EnumerateFiles
方法。如果您使用其他帖子推荐的Directory.GetFiles
方法,则在检索到所有条目之前,方法调用将不会返回。如果使用递归,这可能需要很长时间。
EnumerateFiles
和GetFiles
方法的不同之处如下:
- 当您使用
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)
要遍历文件和文件夹,您通常会使用DirectoryInfo和FileInfo类型。 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);
}
}
}
}