检查文件是否可以读取
本文关键字:读取 是否 文件 检查 | 更新日期: 2023-09-27 18:20:01
这就是我在实际读取之前检查是否可以读取文件的方式
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();
}
这是正确的路吗?
此外,File.Open
和File.ReadAllText
类似吗?我的意思是,它们的性能同样昂贵吗?
是否可以读取文件取决于许多因素:您是否有权限,硬盘是否损坏。我可能会和你走同样的路。
但是,您必须记住,从这种方法中获得的信息只是一个快照。如果在您调用此方法后,有人立即更改了对该文件的权限,那么稍后在代码中访问该文件仍然会失败。你不应该依赖这个方法的结果。
只是一个建议,下面的代码做了同样的事情,但更简洁一点:
try
{
File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read).Dispose();
return true;
}
catch (IOException)
{
return false;
}
由于您并没有真正使用流,因此不必保留对它的引用。相反,您可以通过对File.Open()
的结果调用dispose来立即处理流。
编辑:
请参阅https://gist.github.com/pvginkel/56658191c6bf7dac23b3893fa59a35e8为了解释为什么我把Dispose()
放在File.Open()
的末尾而不是使用using
语句。
如果您想检查异常,只需在Dan Dinu代码中添加适当的try..catch
,例如
try {
using (FileStream stream = File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read)) {
... // <- Do something with the opened file
return true; // <- File has been opened
}
}
catch (IOException) {
return false; // <- File failed to open
}
您的解决方案看起来不错。你也可以使用"使用"语句:
using (FileStream stream = new FileStream())
{
try {
stream = File.Open(this.DataSourceFileName, FileMode.Open, FileAccess.Read);
}
catch { return false; }
}
编译器将其转换为try/finaly块,并在执行块代码后自动处理对象。
文件打开仅打开文件进行读/写操作。
ReadAllText打开文件,读取文本并关闭它,这样会花费更长的时间。;它It’由你来选择适合你情况的方法。