如果我的文件流正在使用中(每次我尝试调试时,它会命中第一行并说它正在使用中),我该如何强制发布?每次碰到这段代码,我都会收到一条消息说某些东西正在使用它:
FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[fileStream.Length];
...etc.
fileStream.Close();
答案 0 :(得分:18)
学习使用using
:
using (FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read))
{
...
}
using
构造确保即使抛出异常也会在离开块时关闭文件。
您的问题可能不在此处,但代码中的其他位置。您必须浏览所有代码并查找已打开文件的位置,但不要将其放在using
语句中。
答案 1 :(得分:4)
还考虑使用
File.ReadAllText(string path);
或
File.ReadAllBytes(string path);
如果您只是想阅读文件的内容并且它不是太大。
答案 2 :(得分:3)
使用using
声明的建议很好;但它不是你唯一的选择。开发人员倾向于首选它的语法“干净”外观和易用性。
主要的事情(以及using
始终为您确保的事情)是确保您无论如何都在呼叫FileStream.Close
。如果您遇到异常,可能会错过此代码。因此,至少要在Close
块中调用finally
。
就个人而言,如果我自己写错误处理,我更喜欢try
/ catch
/ finally
到try
/ using
/ {{1 }}。我很多更喜欢使用catch
的另一种情况是我正在使用多个finally
对象,我想避免深度嵌套。请考虑以下代码:
IDisposable
现在将其与此进行比较:
try {
using (DisposableObject obj1 = GetDisposableObject()) {
// do something
using (DisposableObject obj2 = GetAnotherDisposableObject()) {
// do something else
using (DisposableObject obj3 = GetYetAnotherDisposableObject()) {
// do even more things
// this code is now quite nested
}
}
}
} catch (SomeException ex) {
// some error-handling magic
}
就个人而言,我发现后者更具可读性。
显然,这是个人偏好。以上两个代码示例实现了相同的结果。
答案 3 :(得分:0)
使用using
是正确的方法。
您还可以指定fileshare.readwrite选项以打开锁定它的文件。