File.Create和File.OpenRead和IOException

时间:2011-09-15 09:07:36

标签: c# ioexception

我需要读取在程序的其他部分中打开的文件

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参数。

5 个答案:

答案 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);