当文件不存在时,为什么File.Exists()会慢得多?

19 .net c# file

在我看来,当文件不存在或者用户没有访问权限时文件存在时,File.Exists()要慢得多.

这是真的?

这对我来说没有意义.

Bry*_*ews 42

File.Exists正在捕获异常.提升和捕获异常的开销可能导致性能不佳.

File.Exists 像这样工作:

要检查文件是否存在,它会尝试打开文件...如果抛出异常,则文件不存在.

该过程比打开文件慢,并且不会抛出任何异常(即文件存在时).


Chr*_*s S 32

File.Exists在检查文件存在的文件之前,还要实例化CLR权限.如果你做了很多检查,另一种选择(虽然我没有尝试过性能)是PathFileExists:

[DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
private extern static bool PathFileExists(StringBuilder path);

void Exists()
{
    // A StringBuilder is required for interops calls that use strings
    StringBuilder builder = new StringBuilder();
    builder.Append(@"C:\test.txt");
    bool exists = PathFileExists(builder);
}
Run Code Online (Sandbox Code Playgroud)

  • 这要快得多.我刚刚对一些使用File.Exists的代码进行了非隔离性能测试.然后我在更新我的实现后重新运行它以使用上面的方法.原始代码(在相同的使用场景下)占用了5%的堆栈跟踪时间.使用这种方法,这个数字下降到约0.5%.对于我们反复检查文件存在的过程,这代表了巨大的改进.谢谢! (5认同)
  • 我现在已经测试过,这和File.Exists之间似乎没有任何区别. (3认同)

Meh*_*ari 10

一般来说,当你搜索一堆东西时,除非你已经搜索了所有可能存在的地方,否则你无法确定它们是否存在.当搜索某些东西(在大多数类型的集合中)时,最坏的情况是该集合中不存在该项目.

我没有File.Exists特别的基准,但我非常怀疑,除非你做了数千次,否则这些情况会有明显的区别.你是如何得出这个结论的?