下面是我的代码,用于获取大型目录中的所有文件(Framework 3.5)。它运行~1小时,但无法完成,任务管理器内存高达160万
void ApplyAllFiles(DirectoryInfo dir)
{
String space = " ";
foreach (FileInfo f in dir.GetFiles())
{
try
{
int size = Convert.ToInt32(f.Length / 1024);
if (size > filesize && isFileType(f.FullName) == true)
{
pw.WriteLine(f.LastWriteTime + space + size + space + f.FullName);
}
}
catch
{ }
}
foreach (DirectoryInfo d in dir.GetDirectories())
{
try
{
ApplyAllFiles(d);
}
catch
{
}
}
}
如果我使用Java代码,只需5分钟即可完成,内存总是<100,000 K.我认为C#代码可能存在问题(getFiles&getDirectories对大型目录不利)。我希望有人能帮帮忙。
我解决了这个问题,因为我在内部进行了尝试{}。
您可以创建非递归扩展方法:
public static IEnumerable<FileInfo> GetFilesDepthFirst(this DirectoryInfo root,
string dirPattern = "*", string filePattern = "*.*")
{
var stack = new Stack<DirectoryInfo>();
stack.Push(root);
while (stack.Count > 0)
{
var current = stack.Pop();
IEnumerable<FileInfo> files = Enumerable.Empty<FileInfo>();
IEnumerable<DirectoryInfo> dirs = Enumerable.Empty<DirectoryInfo>();
try
{
#if NET35
dirs = current.GetDirectories(searchPattern: dirPattern);
files = current.GetFiles(searchPattern: filePattern);
#else
dirs = current.EnumerateDirectories(searchPattern: dirPattern);
files = current.EnumerateFiles(searchPattern: filePattern);
#endif
}
catch (UnauthorizedAccessException) { }
catch (PathTooLongException) { }
foreach (FileInfo file in files)
yield return file;
foreach (DirectoryInfo dir in dirs)
stack.Push(dir);
}
}
您可以这样称呼:
var dInfo = new DirectoryInfo("C:\\");
var allFiles = dInfo.GetFilesDepthFirst(filePattern: "*.txt");
foreach(FileInfo file in allFiles)
{
// build output string
}
正如其他用户所说,Directory.GetFiles
很糟糕。 Directory.EnumerateFiles
是一个alternative。
参考here