File.Exists方法是否获得了大量资源?

时间:2012-11-23 12:21:24

标签: c# .net

那么更好的是什么?使用这样的结构:

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

只是

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

使用方法File.Exist()吗?

谢谢!

5 个答案:

答案 0 :(得分:11)

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

所以它应该是

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

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

前者重复检查,如果文件位于网络共享上,则可能会很慢,后者会针对非异常情况引发异常(会被处理),从而使调试变得复杂。两者都有其优点。就个人而言,我通常会选择第二种,但要么是好的。

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

取决于您的计划流程以及您正在执行的操作。如果期望该文件存在,则可以依赖异常处理,因为如果程序不能继续执行,那么很可能需要在调用链中处理更高的异常。

否则,如果相关方法类似于ReadFile(),您将获得True|False|FileNotFound返回代码的疯狂。

使用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存在哪些有效的用例?幸运的是that question has already been asked and answered

答案 3 :(得分:0)

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

之后我会使用try-catch块来处理可能抛出的其他异常(权限等)

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


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

答案 4 :(得分:0)

第一种情况 -

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

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

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

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