回复:http://msdn.microsoft.com/en-us/library/system.io.file.exists.aspx
有谁知道这是一个特别慢或锁定的操作,可能会影响大型环境中的服务器性能?
答案 0 :(得分:11)
在计算方面,实际上没有“昂贵的操作”这样的东西,除非你考虑它的价格是多么昂贵。
例如,在现实世界中,对象的2.000.000美元是否昂贵?如果是巴哈马的价格怎么办?它会贵吗?一箱牛奶怎么样?那很贵吗?
你需要考虑的是,File.Exists
在你打算做的整体操作方面是否昂贵,以及你是否真的有其他选择。
如果你没有其他选择,那么它是否很贵是否重要?
例如,如果你做1检查文件是否存在,然后是否存在,你加载它,花一个小时处理它,然后我认为它不会被认为是昂贵的。
但是,如果你在一个循环中调用它10次,以确定文件是否存在,然后如果它存在,只需增加一个数字,那么它可能是你在那里做的最昂贵的单个操作。 p>
您可以确切知道的唯一方法是实际测量该方法调用所花费的时间,与您在同一操作中的其他内容相比。
答案 1 :(得分:9)
在2016年,它似乎并不昂贵,File.Exists
和PathFileExists
(Why 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");
}
答案 2 :(得分:7)
我认为不是(文件操作在大多数操作系统上进行了大量优化和缓存),而且大多数其他操作更可能是这里的罪魁祸首(套接字,数据库访问,常规处理等)。但是,像往常一样,最好的方法是实际分析您的应用程序,看看它是否是一个热点。
答案 3 :(得分:5)
锁定号码慢,取决于你比较它。就I / O而言,它相当便宜,但与其他操作相比,I / O整体速度通常较慢。所以,如果你必须使用它,它不会伤害太糟糕。但是,我尽量不要把它称之为真正必要的次数! : - )
答案 4 :(得分:2)
最好是在您的环境中运行一些测试。我有一个应用程序可以做到每秒10,000+,而不会打扰我的系统。我认为这很快。
答案 5 :(得分:1)
File.Exisits
使用kernel32.dll FindFirstFile打开文件处理程序。如果结果句柄无效,则返回false。如果有效,它将填充数据结构,包括LastAccessTime,CreationTime,文件大小等所有内容。然后返回true。没有阻止。