当前位置: 首页 > 编程语言 > C#

C#directory.getfiles内存帮助分享

时间:2023-04-10 22:36:20 C#

C#directory.getfiles内存帮助这是我使用的代码:using(StreamWriteroutput=newStreamWriter(Path.Combine(masterdestination,"Master.txt"))){字符串masterfolders=sourcefolder1;string[]filess=Directory.GetFiles(masterfolders,"*.txt");foreach(filess中的字符串文件){output.WriteLine(Path.GetFileName(file));}}此代码将搜索用户指定目录中任何txt文件的所有文件。这些目录有时包含200万个文件。在进程运行时对其进行监控,我发现它的内存使用量攀升至800MB。有没有办法让这个过程保持快速并限制它使用的内存?还是让它读取并转储并继续?哈希表?任何想法都会很棒。Directory.GetFiles真的很糟糕。如果可以使用.NET4.0,则应该使用Directory.EnumerateFiles。来自文档:EnumerateFiles和GetFiles方法的不同之处如下:使用EnumerateFiles时,您可以在返回整个集合之前开始枚举名称集合;使用GetFiles时,必须等待返回整个名称数组,然后才能访问该数组。因此,当您处理许多文件和目录时,EnumerateFiles会更有效率。如果您正在实施搜索,那么我建议您使用WindowsSearch4.0如果您不能使用Fx4,您最好自己编写一个FileEnumerator。这是一个例子。Directory.GetFiles必须在返回之前构建所有匹配文件的列表。只有这样你才能枚举它们。当然,当有大量匹配文件时,它是昂贵的。它甚至可以在内部构建所有文件的列表。如果可以使用.NET4.0,则可以使用Directory.EnumerateFiles,它通过一次返回一个文件来避免此问题。如果你不能,那么我建议你用C++而不是C#来编写它。在C++中,您可以使用FindFirstFile,它也会一次性返回文件。//遍历此目录中的文件//TCHARszWild[MAX_PATH];PathCombine(szWild,masterfolders,_T("*.txt"));WIN32_FIND_DATAfd;HANDLEhFind=FindFirstFile(szWild,&fd);if(INVALID_HANDLE_VALUE!=hFind){do{TCHARszFileName[MAX_PATH];PathCombine(szFileName,masterfolders,fd.cFileName);//将szFilename写入输出流..}while(FindNextFile(hFind,&fd));查找关闭(hFind);正如这里的答案中提到的,如果使用.NET4.0,您可以在Directory类上使用静态EnumerateFiles方法来获取IEnumerable而不是string[],这会导致所有内存消耗。如果您使用的是.NET4.0之前的.NET版本,则可以通过P/Invoke层调用FindFirstFileEx、FindNextFile等方法轻松模拟此功能。然后,对于从调用FindFirstFile/FindNextFile返回的每个文件,您将返回该项目。这将减少EnumerateFiles对包含大量文件的目录的内存消耗,因为您不会将它们全部加载到数组中,而是让它们在找到它们时进行处理。以上就是C#学习教程的全部内容:C#目录。侵权请点击右侧联系管理员删除。如需转载请注明出处: