打开文件只读
问题描述:
目前,这是怎么了,我打开一个文件来阅读:打开文件只读
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...
}
要小心,你仍然有一个棘手的问题,你正在阅读半书面文件。其他进程在随机时间点将数据刷新到文件中,您可能只读取了半行文本。因人而异。
答
你可以通过调用File.SetAttributes
string path = Path.Combine(client._WorkLogFileLoc, "dump.txt");
FileAttributes curAttributes = File.GetAttributes(path);
File.SetAttributes(path, curAttributes | FileAttributes.ReadOnly);
答
如果你要打开的文件的只读设置文件属性,试试这个:
using (TextReader reader = new StreamReader(File.OpenRead(Path.Combine(client._WorkLogFileLoc, "dump.txt")))) {
//do stuff
}
通知调用File.OpenRead()。
你想在阅读模式下打开流?或者你想设置文件属性ReadOnly? – 2011-02-11 01:08:55
想要打开它只读 – xbonez 2011-02-11 01:11:42
请注意,如果另一个进程打开该文件,该进程仍必须启用读共享才能够读取它。如果其他进程以共享被拒绝的方式打开文件,那么即使以只读方式打开文件也会被阻止。有关更多信息,请参阅FileShare枚举(或Win32等效)。 – itowlson 2011-02-11 01:16:27