18

回复:http: //msdn.microsoft.com/en-us/library/system.io.file.exists.aspx

有谁知道这是否是一个特别缓慢或锁定的操作,可能会影响大型环境中的服务器性能?

4

6 回答 6

14

在计算中,实际上不存在“昂贵的操作”之类的东西,除非你考虑到它与什么相关的昂贵。

例如,在现实世界中,2.000.000 美元购买一个物品会很贵吗?如果是巴哈马的价格呢?那会贵吗?一盒牛奶怎么样?那很贵吗?

您需要考虑的事情File.Exists是,就您打算执行的整体操作而言,是否成本高昂,以及您是否真的有任何替代方案。

如果您没有任何替代品,它是否昂贵是否重要?

例如,如果您执行 1 检查文件是否存在,然后如果存在,则将其加载并花一个小时处理它,那么我认为它不会被认为是昂贵的。

但是,如果您在一个循环中调用它 10 次,以确定文件是否存在,然后如果存在,只需增加一个数字,那么它可能是您在那里执行的最昂贵的单个操作。

您可以确定的唯一方法是实际测量该方法调用所花费的时间,与您在同一操作中的其他时间相比。

于 2009-11-10T12:58:30.540 回答
11

在 2016 年,它似乎不是很贵,而且File.ExistsPathFileExists​​为什么 File.Exists() 当文件不存在时要慢得多?)之间似乎也没有真正的区别。我可以测量的唯一区别是检查不存在的文件比检查现有文件更快:

(在 SSD 上测试)

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

void Main()
{
    var sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        File.Exists(@"c:\Home\Temp\test_.log");
    }
    sw.Stop();
    sw.Dump("File.Exists = false");

    sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        File.Exists(@"c:\Home\Temp\test.log");
    }
    sw.Stop();
    sw.Dump("File.Exists = true");

    var sb = new StringBuilder(@"c:\Home\Temp\test_.log");
    sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        PathFileExists(sb);
    }
    sw.Stop();
    sw.Dump("PathFileExists = false");

    sb = new StringBuilder(@"c:\Home\Temp\test.log");
    sw = Stopwatch.StartNew();
    for (int i = 0; i < 10000; i++)
    {
        PathFileExists(sb);
    }
    sw.Stop();
    sw.Dump("PathFileExists = true");

}

结果

于 2016-03-08T14:56:49.727 回答
8

锁号 慢,取决于您将其与什么进行比较。就 I/O 而言,它相当便宜,但与其他操作相比,I/O 总体上通常很慢。所以,如果你必须使用它,它不会伤害太严重。但是,我会尽量不要调用它超过真正必要的次数!:-)

于 2009-11-10T12:49:18.157 回答
7

我不认为是(文件操作在大多数操作系统上都经过高度优化和缓存),并且大多数其他操作更有可能是这里的罪魁祸首(套接字、数据库访问、一般处理等)。但是,像往常一样,最好的方法是实际分析您的应用程序并查看它是否是热点。

于 2009-11-10T12:31:57.873 回答
2

File.Exisits用 kernel32.dll FindFirstFile 打开文件的处理程序。如果结果句柄无效,则返回 false。如果有效,它将用 LastAccessTime、CreationTime、文件大小等所有内容填充数据结构。然后返回真。什么都挡不住。

于 2009-11-10T12:33:33.157 回答
2

最好是在您的环境中运行一些测试。我有一个应用程序每秒可以执行 10,000+ 次,而不会对我的系统造成任何影响。我认为这相当快。

于 2009-11-10T12:42:30.113 回答