2014-02-19 55 views
-6
private Stream GetFileStream(String path) { 
    return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read); 
} 

当尝试和调试时,它看起来好像没有阻塞该文件。但我不完全确定。此代码是否阻止文件?

+0

'但我不完全确定。“为什么?只是测试它是否被阻止(*无论是否意味着*)或不是 –

+0

我无法在并发访问下测试它,就像很少有人同时使用该站点一样。这就是为什么我不确定。 – Ilham

+0

..你可以让并发用户读取同一个文件,他们只是不能同时写入它... – Dayan

回答

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

+0

如果我的情况只是阅读,我是否必须更改当前代码中的任何内容?该文件不会以任何方式更改。我只需要阅读。 – Ilham

+0

我会在这种情况下添加FileShare.Read。 –

+0

好的。这是合乎逻辑的。谢谢。 – Ilham

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); 
} 

这种方法还保证你不会不小心留下一堆FileStreams打开,需要处置。

如果您不能使用内存和必须返回一个流,这样一来会使用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(); 
+0

然后我需要改变@ Ju9OR提到的代码? – Ilham

+0

@Ilham:取决于你想要什么 - 这是做到这一点的一种方式;我在更新的答案中显示了另一个。 –

+0

由于某些原因,我不能使用内存,如果我解释它太多的话。只是我不能使用记忆。我所需要做的就是取得文件流,而不是阻止另一个想要取得该文件流的进程的文件。 – Ilham