如何最好地迭代文件夹和子文件夹以获取指定位置开始的每个文件夹中文件大小、文件总数和文件夹总大小?
如何最好地迭代文件夹和子文件夹以获取指定位置开始的每个文件夹中文件大小、文件总数和文件夹总大小?
如果你使用的是.NET 4,你可能希望使用System.IO.DirectoryInfo.EnumerateDirectories
和System.IO.DirectoryInfo.EnumerateFiles
方法。如果你像其他帖子建议的那样使用Directory.GetFiles
方法,该方法调用将不会返回直到检索到所有条目为止。如果你正在使用递归,这可能需要很长时间。
从文档中可以得知:
EnumerateFiles
和GetFiles
方法的区别如下:
- 当你使用
EnumerateFiles
时,你可以在整个集合被返回之前开始枚举FileInfo
对象的集合。- 当你使用
GetFiles
时,必须等待整个FileInfo
对象数组返回后才能访问数组。因此,在处理许多文件和目录时,
EnumerateFiles
可以更高效。
使用Directory.GetFiles()。该页面底部包括一个完全递归的示例。
注意:如果使用.NET 4及以上版本,请使用下面Chris Dunaway的答案进行更现代化的处理。
// For Directory.GetFiles and Directory.GetDirectories
// For File.Exists, Directory.Exists
using System;
using System.IO;
using System.Collections;
public class RecursiveFileProcessor
{
public static void Main(string[] args)
{
foreach(string path in args)
{
if(File.Exists(path))
{
// This path is a file
ProcessFile(path);
}
else if(Directory.Exists(path))
{
// This path is a directory
ProcessDirectory(path);
}
else
{
Console.WriteLine("{0} is not a valid file or directory.", path);
}
}
}
// Process all files in the directory passed in, recurse on any directories
// that are found, and process the files they contain.
public static void ProcessDirectory(string targetDirectory)
{
// Process the list of files found in the directory.
string [] fileEntries = Directory.GetFiles(targetDirectory);
foreach(string fileName in fileEntries)
ProcessFile(fileName);
// Recurse into subdirectories of this directory.
string [] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
foreach(string subdirectory in subdirectoryEntries)
ProcessDirectory(subdirectory);
}
// Insert logic for processing found files here.
public static void ProcessFile(string path)
{
Console.WriteLine("Processed file '{0}'.", path);
}
}
dir
命令并重定向输出并解析它(或将其管道传输到文件并读取该文件)。当然,除非我预计单个目录中有 50,000+ 文件,否则我不会考虑这种方法。 - quentin-starinFindFirstFile
等函数可能比使用dir
命令更快,尽管我相信.NET最终也会转换为这种方式。 - Lloydstring [] filenames;
fname = Directory.GetFiles(jak, "*.*", SearchOption.AllDirectories).Select(x => Path.GetFileName(x)).ToArray();
然后通过循环或您想要的方式,您可以从数组中获取所需内容。
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);
}
}
}
}
string[] fileNames = Directory.GetFiles("c:\\", "*.*", SearchOption.AllDirectories);
int fileCount = fileNames.Count();
long fileSize = fileNames.Select(file => new FileInfo(file).Length).Sum(); // in bytes
Directory.Exists
(否则,DirectoryNotFoundException
)。我想不到其他什么了,但也许我漏掉了些什么。 - HuBeZa要遍历文件和文件夹,通常会使用 DirectoryInfo 和 FileInfo 类型。FileInfo 类型具有返回文件大小(以字节为单位)的 Length 属性。
我认为你必须编写自己的代码来遍历文件并计算总文件大小,但这应该是一个相当简单的递归函数。