C#目录列出大量目录
以下是场景: 我有一个包含200多万个文件的目录。下面的代码在大约90分钟内写出所有文件。有没有人有办法加快速度或使这段代码更有效?我还想只写出清单中的文件名C#目录列出大量目录,c#,file-io,C#,File Io,以下是场景: 我有一个包含200多万个文件的目录。下面的代码在大约90分钟内写出所有文件。有没有人有办法加快速度或使这段代码更有效?我还想只写出清单中的文件名 string lines = (listBox1.Items.ToString()); string sourcefolder1 = textBox1.Text; string destinationfolder = (@"C:\anfiles"); using (StreamWriter output = new StreamW
string lines = (listBox1.Items.ToString());
string sourcefolder1 = textBox1.Text;
string destinationfolder = (@"C:\anfiles");
using (StreamWriter output = new StreamWriter(destinationfolder + "\\" + "MasterANN.txt"))
{
string[] files = Directory.GetFiles(textBox1.Text, "*.txt");
foreach (string file in files)
{
FileInfo file_info = new FileInfo(file);
output.WriteLine(file_info.Name);
}
}
慢的是它一次写一行
大约需要13-15分钟才能获得需要写出的所有文件
接下来的75分钟是创建文件的时间。我需要知道的第一件事是,速度在哪里?执行Directory.GetFiles()需要89分钟,还是延迟分散在对
FileInfo file\u info=newfileinfo(file)的调用上代码>
如果延迟来自后者,您可能可以通过从路径获取文件名而不是创建FileInfo实例来获取文件名来加快速度
System.IO.Path.GetFileName(file);
您正在将200多万个文件描述符读入内存。取决于你有多少内存,你很可能正在交换。尝试通过过滤文件名将其分成更小的块。根据我的经验,是目录.GetFiles
让您的速度变慢了(除了控制台输出)。要克服此问题,请P/Invoke into/以避免所有内存消耗和一般性延迟。如果不为每个文件创建FileInfo实例,请改用Path.GetFileName:
string lines = (listBox1.Items.ToString());
string sourcefolder1 = textBox1.Text;
string destinationfolder = (@"C:\anfiles");
using (StreamWriter output = new StreamWriter(Path.Combine(destinationfolder, "MasterANN.txt"))
{
string[] files = Directory.GetFiles(textBox1.Text, "*.txt");
foreach (string file in files)
{
output.WriteLine(Path.GetFileName(file));
}
}
使用不需要首先将所有文件名加载到内存中。看看这个:
在您的情况下,代码可能是:
using (StreamWriter output = new StreamWriter(destinationfolder + "\\" + "MasterANN.txt"))
{
foreach (var file in Directory.EnumerateFiles(sourcefolder, "*.txt"))
{
output.WriteLine(Path.GetFileName(file));
}
}
从一开始,它说:
EnumerateFiles和GetFiles方法的区别如下:使用EnumerateFiles时,可以在返回整个集合之前开始枚举名称集合;使用GetFiles时,必须等待返回整个名称数组,然后才能访问该数组。因此,当您处理许多文件和目录时,枚举文件可以更有效
因此,如果您有足够的内存,Directory.GetFiles就可以了。但是当一个文件夹包含数百万个文件时,Directory.EnumerateFiles要好得多。类似:它与您的问题无关,但不要这样做:destinationfolder+“\\\”+“MasterANN.txt改为使用Path.Combine(destinationfolder,“MasterANN.txt”),如果您使用dir从命令行执行此操作,是否会更快dir/b*.txt>c:\anfiles\MasterANN.txt”。如果是这样的话,您可以使用Process类将文件发送到dir。FileInfo file\u info=new FileInfo(file;output.WriteLine(file\u info.Name);太棒了!感谢您这么做。不仅比Directory.GetFiles更好,而且比Directory.GetFiles更快。实际上,这是众所周知的“诀窍”,也就是最好的答案(考虑到您不想在p/Invoke上有那么多乱七八糟的东西,也不想在第三方库上乱搞)。