如何以ShareDenyWrite模式打开StreamReader?

6

我该如何使用StreamReader打开一个带有FILE_SHARE_READFILE_SHARE_WRITEFILE_SHARE_DELETE的文件?


同样的问题,稍微拓展一下

如何打开一个StreamReader以便读取一个编码的文本文件,并使用共享选项使另一个进程可以读取该文件?

如何打开一个StreamReader以便读取一个编码的文本文件,并使用共享选项使另一个进程在我读取文件时可以修改该文件?

如何打开一个StreamReader以便读取一个编码的文本文件,并使用共享选项使另一个进程可以在我读取文件时删除该文件?


同样的问题,稍微扩展一下

.NET Framework类库中有一个名为StreamReader的类。它是唯一设计用于读取"文本"的类,这就是为什么它继承自抽象基类TextReader的原因。 TextReader/StreamReader允许您指定要打开的文件使用的编码,并且可以为您解码该文件,返回文本Strings

一旦我使用StreamReader打开了一个文件:

var sr = new StreamReader(path);

文件被锁定,其他进程无法修改或删除该文件。我需要的是与FileStream类的FileShare枚举相当的东西。
  • None: 拒绝共享当前文件。任何尝试打开该文件的请求(无论是由此进程还是另一个进程)都将失败,直到该文件关闭。
  • Read: 允许后续以读取方式打开文件。如果未指定此标志,则任何尝试以读取方式打开文件的请求(无论是由此进程还是另一个进程)都将失败,直到该文件关闭。但是,即使指定了此标志,仍可能需要其他权限才能访问该文件。
  • Write: 允许后续以写入方式打开文件。如果未指定此标志,则任何尝试以写入方式打开文件的请求(无论是由此进程还是另一个进程)都将失败,直到该文件关闭。但是,即使指定了此标志,仍可能需要其他权限才能访问该文件。
  • ReadWrite: 允许后续以读取或写入方式打开文件。如果未指定此标志,则任何尝试以读取或写入方式打开文件的请求(无论是由此进程还是另一个进程)都将失败,直到该文件关闭。但是,即使指定了此标志,仍可能需要其他权限才能访问该文件。
  • Delete: 允许后续删除文件。
除此之外,由于显而易见的原因,我不能使用 FileStream - 必须使用 StreamReader
如何使用 FileShare.ReadWrite | FileShare.Delete 打开一个 StreamReader
2个回答

11

StreamReader 有一个构造函数,可以接受一个流。因此,不要使用接受字符串路径的构造函数,而是首先创建一个带有所需选项的FileStream,然后将该FileStream传递给StreamReader构造函数。


7
如何使用FileShare.ReadWrite | FileShare.Delete打开StreamReader?
当你已经为流解决了问题,读取器就很容易了:
var fs = new FileStream(fileName, FileMode.Open, FileShare.ReadWrite|FileShare.Delete);
var sr = new StreamReader(fs);

当然,这应该被包裹在一个 using() { } 块中。

抱歉,Henk,但是Sean比你更需要这个声望值 :) - Ian Boyd
在C# 4.5中,我看到使用方式为var fs = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete);,也就是说,在FileMode.Open和FileShare.ReadWrite之间添加了另一个参数,即FileAccess。 - phoad
@phoad - 我认为这不是新的,它有多个重载。 - H H
我的意思是,我找不到只有FileShare参数的构造函数,如果想要使用FileShare,则所有构造函数都需要FileAccess参数。http://msdn.microsoft.com/en-us/library/system.io.filestream%28v=vs.110%29.aspx - phoad

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