File.Create and File.OpenRead and IOException

3
我需要读取一个在程序的其他部分被打开进行写入的文件。
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参数。

在读取之前确保文件已关闭。 - 62071072SP
如果您在应用程序的另一个部分中打开了它,请将其重构为使用单个实例/服务,以便您只需打开它一次。 - Random Dev
不。我需要从已被打开以进行写操作的文件中读取。Windows 必须允许此操作。 - Alex
1
@Alex:尝试将FileShare.Read更改为FileShare.ReadWrite。 - 62071072SP
5个回答

6

在这两个语句中,将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);

ReadWrite 标志的 MSDN 描述:

允许随后打开文件进行读取或写入。如果没有指定此标志,则任何对该文件进行读取或写入的请求(由此进程或其他进程)将在文件关闭之前失败。


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之间存在自然混淆。第一个基本上是您创建的流的权限,第二个是其他任何流的权限。

0
你需要使用 .Close() 方法先关闭文件。

不行。我需要从已经打开以进行写入的文件中读取内容。Windows 必须允许此操作。 - Alex

0
第一个流将写入文件,而第二个流仅允许读取。
FileStream create = File.Open(fileName, FileMode.Create, **FileAccess.Write**, FileShare.Read);
FileStream openRead = File.Open(fileName, FileMode.Open, FileAccess.Read, **FileShare.Read**);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接