繁体   English   中英

File.Create和File.OpenRead和IOException

[英]File.Create and File.OpenRead and 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参数。

在两个语句中将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标志描述:

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

要完成Reniuz的答案,您可以这样做:

FileStream create = File.Open(fileName, FileMode.Create, FileAccess.Write, FileShare.Read);
FileStream openRead = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

注意FileShare.Read是第一个用于写访问的FileStream。 写入流允许其他流读取它。 FileShare.ReadWrite流中设置FileShare.ReadWrite似乎不安全。

用于读取访问的第二个流有效地需要设置FileShare.ReadWrite因为参数FileShare定义了其他流的权限。 如果在另一个流已经打开以进行写入时只设置了FileShare.Read ,则读取器流根本无法满足FileShare.Read权限(隐含地说该流不能由另一个流写入)。

我认为FileAccess和FileShare这两个参数之间存在着自然的混淆。 第一个基本上是您创建的流的权限,第二个是任何其他流。

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

第一个流将写入文件,而第二个流只允许读取

FileStream create = File.Open(fileName, FileMode.Create, **FileAccess.Write**, FileShare.Read);
FileStream openRead = File.Open(fileName, FileMode.Open, FileAccess.Read, **FileShare.Read**);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM