这段代码会阻止文件吗?

时间:2014-02-19 21:20:20

标签: c# .net stream

private Stream GetFileStream(String path) {
    return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read);
}

尝试和调试时,看起来它没有阻止文件。但我不完全确定。

2 个答案:

答案 0 :(得分:3)

根据您的需要,您可以向File.Open方法添加第四个参数。

要打开具有只读访问权限的文件,并允许随后打开文件进行阅读:

private Stream GetFileStream(String path) {
    return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read);
}

这允许读写:

private Stream GetFileStream(String path) {
    return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
}

这会阻止此过程或其他过程:

private Stream GetFileStream(String path) {
    return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read, FileShare.None);
}

File.Open Method

答案 1 :(得分:2)

代码的工作方式, 阻止文件。

在这种情况下,我对阻止文件的理解是,第一次调用GetFileStream()方法时它正在使用,任何后续访问该文件的尝试都将抛出System.IO.IOException因为文件已被使用(直到关闭并处理流)。

我不确定你做了什么测试,但这是一个简单的测试,第二次调用GetFileStream()会抛出异常:

class Program
{
    static void Main(string[] args)
    {
        var test = new OpenFileTest("SomeFile.txt");
        Console.ReadKey();
    }
}

public class OpenFileTest
{
    public OpenFileTest(string path)
    {
        var stream1 = GetFileStream(path);
        var stream2 = GetFileStream(path);  // throws IOException
    }

    private Stream GetFileStream(String path)
    {
        return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read);
    }
}

如果您想以只读方式获取文件并多次访问它,为什么不使用File.ReadAllText()File.ReadAllLines()更改方法以读取文件并将结果存储在内存中?

private string[] GetFileLines(String path)
{
    return !File.Exists(path) ? null : File.ReadAllLines(path);
}

此方法还可以保证您不会意外地将一堆FileStream打开,这需要处理掉。

如果你不能使用内存并且必须返回一个流,这种方式将使用FileShare.Read来处理它

private Stream GetFileStream(String path)
{
    return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read);
}

但是,无论何时调用该方法,调用方法都必须处理Stream对象以防止内存泄漏。

// do stuff with stream;
stream1.Close();
stream1.Dispose();