FileStream正在使用中

时间:2010-02-15 20:02:44

标签: c# filestream

如果我的文件流正在使用中(每次我尝试调试时,它会命中第一行并说它正在使用中),我该如何强制发布?每次碰到这段代码,我都会收到一条消息说某些东西正在使用它:

FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[fileStream.Length];
...etc.
fileStream.Close();

4 个答案:

答案 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 / finallytry / 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选项以打开锁定它的文件。