File.Exists是一项昂贵的操作吗?

时间:2009-11-10 12:22:01

标签: .net file io exists

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

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

6 个答案:

答案 0 :(得分:11)

在计算方面,实际上没有“昂贵的操作”这样的东西,除非你考虑它的价格是多么昂贵。

例如,在现实世界中,对象的2.000.000美元是否昂贵?如果是巴哈马的价格怎么办?它会贵吗?一箱牛奶怎么样?那很贵吗?

你需要考虑的是,File.Exists在你打算做的整体操作方面是否昂贵,以及你是否真的有其他选择。

如果你没有其他选择,那么它是否很贵是否重要?

例如,如果你做1检查文件是否存在,然后是否存在,你加载它,花一个小时处理它,然后我认为它不会被认为是昂贵的。

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

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

答案 1 :(得分:9)

在2016年,它似乎并不昂贵,File.ExistsPathFileExistsWhy is File.Exists() much slower when the file does not exist?)之间似乎没有真正的区别。我可以测量的唯一区别是,检查不存在的文件比现有文件更快:

(在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");

}

Results

答案 2 :(得分:7)

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

答案 3 :(得分:5)

锁定号码慢,取决于你比较它。就I / O而言,它相当便宜,但与其他操作相比,I / O整体速度通常较慢。所以,如果你必须使用它,它不会伤害太糟糕。但是,我尽量不要把它称之为真正必要的次数! : - )

答案 4 :(得分:2)

最好是在您的环境中运行一些测试。我有一个应用程序可以做到每秒10,000+,而不会打扰我的系统。我认为这很快。

答案 5 :(得分:1)

File.Exisits使用kernel32.dll FindFirstFile打开文件处理程序。如果结果句柄无效,则返回false。如果有效,它将填充数据结构,包括LastAccessTime,CreationTime,文件大小等所有内容。然后返回true。没有阻止。