【问题标题】:Open file ReadOnly打开文件只读
【发布时间】:2011-02-11 01:07:32
【问题描述】:

目前,这是我打开文件以读取它的方式:

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

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

【问题讨论】:

  • 您想以阅读模式打开流吗?还是要设置文件属性ReadOnly?
  • 请注意,如果另一个进程打开了文件,则该进程仍然必须启用读取共享才能读取它。如果其他进程在共享被拒绝的情况下打开文件,那么即使以只读方式打开文件也将被阻止。有关详细信息,请参阅 FileShare 枚举(或 Win32 等效项)。

标签: c# file-io


【解决方案1】:

典型的问题是其他进程打开了文件进行写入。所有标准 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。

【讨论】:

  • 谢谢。看来这就是我想要的。由于我的程序处理读取文件的方式,读取半写文件对我来说不是问题。
  • 这救了我!正如您所说的,所有其他功能都使用 FileShare.Read 打开。很长一段时间以来,我一直在尝试找出不同的 streanreader 函数变体......!
  • 完美运行。正是我需要的。谢谢!
【解决方案2】:

如果你想以只读方式打开文件,试试这个:

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

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

【讨论】:

  • 该死,秒杀我。 ;p +1 给你。
【解决方案3】:

可以通过调用File.SetAttributes设置文件属性

string path = Path.Combine(client._WorkLogFileLoc, "dump.txt");
FileAttributes curAttributes = File.GetAttributes(path);
File.SetAttributes(path, curAttributes | FileAttributes.ReadOnly);

【讨论】:

  • 我只是想知道:在进程/线程中设置文件属性。它是否影响正在访问文件以进行写访问的其他进程/线程?
【解决方案4】:

根据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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-12
    • 2011-11-22
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多