打开文件ReadOnly

时间:2011-02-11 01:07:32

标签: c# file-io

目前,我正在打开一个文件来阅读它:

 using (TextReader reader = new StreamReader(Path.Combine(client._WorkLogFileLoc, "dump.txt")))
{
    //do stuff
}

如何在ReadOnly模式下打开文件,这样如果另一个进程同时打开文件,我的程序仍然可以读取它。

4 个答案:

答案 0 :(得分:99)

典型的问题是其他进程打开文件进行写入。所有标准的File方法和StreamReader构造函数都使用FileShare.Read打开文件。这无法奏效,否认写共享。你不能否认写作,另一个过程是第一个并获得写入权限。因此,您将被拒绝访问。

您必须使用FileShare.ReadWrite,如下所示:

var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
using (var sr = new StreamReader(fs))
{
    // etc...
}

请注意,您仍然会遇到一个棘手的问题,您正在阅读半文件。另一个进程在随机时间点将数据刷新到文件中,您可能只读取半行文本。 YMMV。

答案 1 :(得分:11)

如果您想以只读方式打开文件,请尝试以下操作:

using (TextReader reader 
   = new StreamReader(File.OpenRead(Path.Combine(client._WorkLogFileLoc, "dump.txt")))) 
{     
         //do stuff 
} 

请注意对File.OpenRead()的调用。

答案 2 :(得分:3)

您可以通过调用File.SetAttributes

来设置文件属性
string path = Path.Combine(client._WorkLogFileLoc, "dump.txt");
FileAttributes curAttributes = File.GetAttributes(path);
File.SetAttributes(path, curAttributes | FileAttributes.ReadOnly);

答案 3 :(得分:-1)

https://docs.microsoft.com/en-us/dotnet/api/system.io.file.openread?redirectedfrom=MSDN&view=netcore-3.1#System_IO_File_OpenRead_System_String_ File.OpenRead启用读取共享访问而不是读/写。这将阻止“其他进程”在xbonez允许的情况下关闭/重新打开/写入更多数据。 hans-passant可以满足要求。

根据参考文档:该方法等效于FileStream(String,FileMode,FileAccess,FileShare)构造函数重载,其FileMode值为Open,FileAccess值为Read,FileShare值为Read。