File.Create 和 File.OpenRead 以及 IOException

发布于 2024-12-04 19:59:49 字数 440 浏览 6 评论 0原文

我需要读取在程序的其他部分打开以进行写入的文件

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

I need to read a file that is opened for writing in other part of the program

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

The last line raises IOException:

"The process cannot access the file because it is being used by another process"

Please help properly configure File.Open parameters.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

童话里做英雄 2024-12-11 19:59:49

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

允许随后打开文件进行读取或写入。如果未指定此标志,则任何打开文件进行读取或写入的请求(通过此进程或另一个进程)都将失败,直到文件关闭为止。

Change FileShare parameter to FileShare.ReadWrite in both statement:

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

ReadWrite flag description from MSDN:

Allows subsequent opening of the file for reading or writing. If this flag is not specified, any request to open the file for reading or writing (by this process or another process) will fail until the file is closed.

仙气飘飘 2024-12-11 19:59:49

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

To complete Reniuz's answer, you can do this :

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

Notice FileShare.Read for the first FileStream for write access. The write stream allows other streams to read it. It doesn't seem safe to set FileShare.ReadWrite in the writer stream.

The second stream for read access effectively need to set FileShare.ReadWrite because the parameter FileShare defines the permissions for other streams. If you set only FileShare.Read while another stream is already open for write, the reader stream simply cannot fulfill the FileShare.Read permission (which implicitly says the stream cannot be written by another stream).

I think there is a natural confusion between the two parameters FileAccess and FileShare. The first is basically the permission of the stream you create, the second is for any other.

冷心人i 2024-12-11 19:59:49

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

You need to close the file first with the .Close() method.

心意如水 2024-12-11 19:59:49

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

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

The first stream is going to write to the file whereas the second one permits reading only

FileStream create = File.Open(fileName, FileMode.Create, **FileAccess.Write**, FileShare.Read);
FileStream openRead = File.Open(fileName, FileMode.Open, FileAccess.Read, **FileShare.Read**);
陌上芳菲 2024-12-11 19:59:49

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

Use FileShare.ReadWrite for that:

 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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文