4

那么什么更好呢?要使用这样的构造:

if (File.Exist(fileName))
{
    // do something with file...
}

只是

try 
{
    // do something with file.
}
catch(Exception ex)
{
}

使用方法 File.Exist() 是否花费很多?

谢谢!

4

5 回答 5

11

前者有一个竞争条件:另一个进程可能会在File.Exists返回 true 之后但在您打开文件之前删除文件。后者没有。即使您事先检查,如果您想忽略不存在的文件,您仍然应该捕获异常。

所以它应该是

if (File.Exists(fileName))
{
    try
    {
        // ...
    }
    catch (FileNotFoundException)
    { }
}

或者

try
{
    // ...
}
catch (FileNotFoundException)
{ }

前者会重复检查,如果文件位于网络共享上,这可能会很慢,后者会针对非异常情况引发异常(已处理),从而使调试复杂化。两者都有其优点。就个人而言,我通常选择第二个,但任何一个都可以。

于 2012-11-23T12:27:52.920 回答
5

不应使用异常来处理应用程序的流程,其想法是避免异常,而不是将它们视为执行流程的正常部分。

对于 99.999% 的应用程序,如果有任何性能差异,将不会是明显的。如果文件应该在那里并且没有找到是一种特殊情况,您可以使用该 try catch块,否则我会说您应该采用这种File.Exist方法。

于 2012-11-23T12:25:20.143 回答
1

取决于您的程序流程和您正在执行的操作。如果您希望该文件存在,则可以依赖异常处理,因为如果不存在,您的程序将无法继续,并且异常很可能需要在调用链的更高层进行处理。

否则,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?幸运的是,这个问题已经被问及并得到了回答

于 2012-11-23T12:27:18.180 回答
0

首先我会检查文件是否存在,如果不存在则抛出异常。

之后,我将使用 try-catch 块来处理可能引发的其他异常(权限等)

if (!File.Exist(fileName))
{
    throw new ArgumentException("filename");
    // or throw new FileNotFoundException("filename");
}


try 
{
    // do something with file.
}
catch(Exception ex)
{
}
于 2012-11-23T12:29:56.197 回答
0

第一个案例——

if (File.Exist(fileName)) //A single statement to check and proceed. 

虽然后来的异常处理方法涉及 -

如果object引发异常,将创建并传递给相应的 catch 块的异常类。

我更喜欢第一种方法,因为使用异常处理来处理执行流程不是一个好主意。

于 2012-11-23T12:35:06.020 回答