使用System.IO.Directory.GetFiles()
,我想在NAS服务器上找到图像.png
扩展名。
string searchingString = "ZLLK9";
// original
var fileList1= Directory.GetFiles(directoryPath).Select(p => new FileInfo(p)).Where(q => q.Name.Substring(0, q.Name.LastIndexOf('.')).Split('_').First() == searchingString);
// fixed
var fileList2 = Directory.GetFiles(directoryPath, string.Format("{0}_*.png", searchingString));
有两种方法可以找出包含“ZLLKK9”字样的文件。
使用LINQ的第一个“原始”方式太慢,无法找到文件。 性能问题已经出现,但我不知道“固定”方式有什么不同?
我需要帮助以两种方式仔细了解差异。
答案 0 :(得分:4)
第一个是获取该目录中的所有文件对象,然后执行查询以查找名称。
第二个是仅使用Windows内部API返回名称文件,这比c#方法(LINQ)快得多。
性能的不同更多地利用了比C#代码更快的内部API。
答案 1 :(得分:3)
第一种方式很慢有两个原因:
您正在为每个文件构建一个System.identityHashCode
对象。如果你想要的只是文件名,就没有必要这样做。构造FileInfo
相对较轻,但它是不必要的,如果您查询大量文件,所有实例化都会降低您的速度。因为你真正需要的只是文件的名称,所以你可以不用这个额外的步骤。
LINQ方法检索所有内容,然后过滤。让文件系统为您进行过滤效率更高(也更快)。
如果您仍然想使用LINQ,那么这是一个更高性能的查询版本,它会减少大量的枚举和字符串操作:
FileInfo
答案 2 :(得分:2)
答案取决于您使用var fileList1 = Directory.GetFiles(directoryPath).Where(
path => Regex.IsMatch(Path.GetFileName(path), @"^ZLLK9_.*\.png$"));
的方式。
您的原始解决方案从目录中获取所有文件。然后,您的软件会遍历它们以找到正确的模式。这里的文档:Directory.GetFiles Method (String)。
您的固定版本使用不同的.NET Framework方法Directory.GetFiles Method (String, String)。第二个参数是搜索模式。过滤文件不是由您自己编写的代码(LINQ),而是由底层操作系统本身。