C#目录列出大量目录

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

以下是场景:

我有一个包含200多万个文件的目录。下面的代码在大约90分钟内写出所有文件。有没有人有办法加快速度或使这段代码更有效?我还想只写出清单中的文件名

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上有那么多乱七八糟的东西,也不想在第三方库上乱搞)。