检查是否可以读取文件

Paw*_*iya 10 c# io file-io

这就是我试图检查是否可以在实际读取之前读取文件的方法

FileStream stream = new FileStream();
try
{
   // try to open the file to check if we can access it for read
   stream = File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read);
}
catch (IOException ex)
{
   return false;
}
finally
{
   stream.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

File.Open类似于File.ReadAllText,我的意思是,它们的性能同样昂贵吗?

Pie*_*kel 6

是否可以读取文件取决于许多因素:您是否具有权限,硬盘是否损坏。我可能会走与您相同的路线。

但是,您必须记住,从此方法获得的信息只是快照。如果在调用此方法后立即有人更改了该文件的权限,则以后在代码中访问该文件仍然会失败。您不应该依赖此方法的结果。

只是一个建议,下面的代码执行相同的操作,但更加简洁:

try
{
    File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read).Dispose();
    return true;
}
catch (IOException)
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

由于您并没有真正使用流,因此不必保留对其的引用。取而代之的是,您只需调用的处理结果就可以立即处理流File.Open()

编辑:

请参阅https://gist.github.com/pvginkel/56658191c6bf7dac23b3893fa59a35e8,以获取有关为什么将放在Dispose()结尾File.Open()而不是使用using语句的解释。

  • 不,代码实际上是正确的。请参阅 https://gist.github.com/pvginkel/56658191c6bf7dac23b3893fa59a35e8 了解原因的解释。你是对的,你可以使用“using”,但上面的代码的作用完全相同,而且更短。代码无法造成资源泄漏的原因是,当“File.Open()”中发生异常时,您将无法访问返回值,因为如果方法抛出,它不会返回任何内容。因此,“File.Open()”方法有责任在抛出异常时进行清理。 (2认同)

Dan*_*inu -1

你的解决方案看起来不错。您还可以使用“using”语句:

using (FileStream stream = new FileStream()) 
{
       try {
       stream = File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read);
       }
        catch { return false; }
}
Run Code Online (Sandbox Code Playgroud)

编译器将其转换为 try/finally 块,并在执行块代码后自动释放该对象。

文件打开仅打开文件以进行读/写。

ReadAllText 打开文件读取文本并关闭它,因此需要更长的时间。您可以选择适合您情况的方法。

  • 这*不是*使用“using”的方式。您不应该在“using”中分配“stream”。 (5认同)