private Stream GetFileStream(String path) {
return !File.Exists(path) ? null : File.Open(path, FileMode.Open, FileAccess.Read);
}
尝试和调试时,看起来它没有阻止文件。但我不完全确定。
答案 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);
}
答案 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();