那么什么更好呢?要使用这样的构造:
if (File.Exist(fileName))
{
// do something with file...
}
只是
try
{
// do something with file.
}
catch(Exception ex)
{
}
使用方法 File.Exist() 是否花费很多?
谢谢!
前者有一个竞争条件:另一个进程可能会在File.Exists
返回 true 之后但在您打开文件之前删除文件。后者没有。即使您事先检查,如果您想忽略不存在的文件,您仍然应该捕获异常。
所以它应该是
if (File.Exists(fileName))
{
try
{
// ...
}
catch (FileNotFoundException)
{ }
}
或者
try
{
// ...
}
catch (FileNotFoundException)
{ }
前者会重复检查,如果文件位于网络共享上,这可能会很慢,后者会针对非异常情况引发异常(已处理),从而使调试复杂化。两者都有其优点。就个人而言,我通常选择第二个,但任何一个都可以。
不应使用异常来处理应用程序的流程,其想法是避免异常,而不是将它们视为执行流程的正常部分。
对于 99.999% 的应用程序,如果有任何性能差异,将不会是明显的。如果文件应该在那里并且没有找到是一种特殊情况,您可以使用该 try catch
块,否则我会说您应该采用这种File.Exist
方法。
取决于您的程序流程和您正在执行的操作。如果您希望该文件存在,则可以依赖异常处理,因为如果不存在,您的程序将无法继续,并且异常很可能需要在调用链的更高层进行处理。
否则,True|False|FileNotFound
如果有问题的方法类似于ReadFile()
.
使用 File.Exists 来“安全地”打开一个文件是非常没用的。考虑一下:
public String ReadFile(String filename)
{
if (!File.Exists(filename))
{
// now what? throw new FileNotFoundException()? return null?
}
// Will throw FileNotFoundException if not exists, can happen (race condition, file gets deleted after the `if` above)
using (var reader = new StreamReader(filename))
{
return reader.ReadToEnd();
}
}
有人可能会说,如果要向文件附加数据,则要检查文件是否存在,但是StreamWriter构造函数有一个带append
参数的重载,如果文件不存在,它将让编写器创建文件并附加到如果是的话。
所以,也许问题最好是:存在哪些有效用例File.Exists
?幸运的是,这个问题已经被问及并得到了回答。
首先我会检查文件是否存在,如果不存在则抛出异常。
之后,我将使用 try-catch 块来处理可能引发的其他异常(权限等)
if (!File.Exist(fileName))
{
throw new ArgumentException("filename");
// or throw new FileNotFoundException("filename");
}
try
{
// do something with file.
}
catch(Exception ex)
{
}
第一个案例——
if (File.Exist(fileName)) //A single statement to check and proceed.
虽然后来的异常处理方法涉及 -
如果object
引发异常,将创建并传递给相应的 catch 块的异常类。
我更喜欢第一种方法,因为使用异常处理来处理执行流程不是一个好主意。