private Stream GetFileStream(String path) {
return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read);
}
当尝试和调试时,它看起来好像没有阻塞该文件。但我不完全确定。此代码是否阻止文件?
private Stream GetFileStream(String path) {
return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read);
}
当尝试和调试时,它看起来好像没有阻塞该文件。但我不完全确定。此代码是否阻止文件?
根据你想要什么你可以添加第四个参数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);
}
您的代码的工作方式,它确实阻止文件。
我块的理解在这种情况下,该文件是,它是在第一次调用使用您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();
'但我不完全确定。“为什么?只是测试它是否被阻止(*无论是否意味着*)或不是 –
我无法在并发访问下测试它,就像很少有人同时使用该站点一样。这就是为什么我不确定。 – Ilham
..你可以让并发用户读取同一个文件,他们只是不能同时写入它... – Dayan