目前,这是我打开文件并读取它的方法:
using (TextReader reader = new StreamReader(Path.Combine(client._WorkLogFileLoc, "dump.txt")))
{
//do stuff
}
我如何以只读模式打开文件,这样如果另一个进程同时打开了该文件,我的程序仍然可以读取它。
目前,这是我打开文件并读取它的方法:
using (TextReader reader = new StreamReader(Path.Combine(client._WorkLogFileLoc, "dump.txt")))
{
//do stuff
}
我如何以只读模式打开文件,这样如果另一个进程同时打开了该文件,我的程序仍然可以读取它。
典型问题是另一个进程正在写入该文件。所有标准的File方法和StreamReader构造函数都使用FileShare.Read打开文件。这不能工作,它拒绝了写共享。你不能拒绝写,其他进程已经获取了写访问权限。因此,你将被拒绝访问。
你必须像这样使用FileShare.ReadWrite:
var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
using (var sr = new StreamReader(fs))
{
// etc...
}
请注意,您仍将面临一个棘手的问题,即您正在读取一个未完成的文件。另一个进程在随机时间点刷新数据到文件中,您可能只读取了一半的文本行。结果可能因人而异。
如果你想以只读模式打开文件,请尝试以下方法:
using (TextReader reader
= new StreamReader(File.OpenRead(Path.Combine(client._WorkLogFileLoc, "dump.txt"))))
{
//do stuff
}
注意调用File.OpenRead()方法。
string path = Path.Combine(client._WorkLogFileLoc, "dump.txt");
FileAttributes curAttributes = File.GetAttributes(path);
File.SetAttributes(path, curAttributes | FileAttributes.ReadOnly);
根据https://learn.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解决了所请求的问题。
根据引用的文档:此方法等效于使用FileMode值为Open、FileAccess值为Read和FileShare值为Read的FileStream(String, FileMode, FileAccess, FileShare)构造函数重载。