目前,我正在打开一个文件来阅读它:
using (TextReader reader = new StreamReader(Path.Combine(client._WorkLogFileLoc, "dump.txt")))
{
//do stuff
}
如何在ReadOnly模式下打开文件,这样如果另一个进程同时打开文件,我的程序仍然可以读取它。
答案 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。