我需要读取在程序的其他部分中打开的文件
const string fileName = "file.bin";
FileStream create = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.Read);
FileStream openRead = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
最后一行引发IOException:
"The process cannot access the file because it is being used by another process"
请帮助正确配置File.Open参数。
答案 0 :(得分:5)
在两个声明中将FileShare
参数更改为FileShare.ReadWrite
:
FileStream create = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
FileStream openRead = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
来自MSDN的 ReadWrite
标志说明:
允许随后打开文件进行读写。如果未指定此标志,则在文件关闭之前,任何打开文件以进行读取或写入(通过此进程或其他进程)的请求都将失败。
答案 1 :(得分:1)
要完成Reniuz的回答,您可以这样做:
FileStream create = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.Read);
FileStream openRead = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
注意第一个用于写访问的FileStream的FileShare.Read
。写入流允许其他流读取它。在编写器流中设置FileShare.ReadWrite
似乎并不安全。
第二个读取访问流实际上需要设置FileShare.ReadWrite
,因为参数FileShare定义了其他流的权限。如果在另一个流已经打开以进行写入时仅设置FileShare.Read
,则读取器流无法满足FileShare.Read
权限(隐含地表示该流不能由另一个流写入)。
我认为FileAccess和FileShare这两个参数之间存在着自然的混淆。第一个基本上是您创建的流的权限,第二个是任何其他流。
答案 2 :(得分:0)
您需要先使用.Close()方法关闭文件。
答案 3 :(得分:0)
第一个流将写入文件,而第二个流只允许读取
FileStream create = File.Open(fileName, FileMode.Create, **FileAccess.Write**, FileShare.Read);
FileStream openRead = File.Open(fileName, FileMode.Open, FileAccess.Read, **FileShare.Read**);
答案 4 :(得分:0)
使用FileShare.ReadWrite
:
const string fileName = "file.bin";
FileStream create = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
FileStream openRead = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);