C#读取锁定文件

时间:2017-11-06 20:51:25

标签: c# filestream streamreader

到目前为止,我已经尝试了一切但没有成功。

我想要完成的是,我想打开并锁定文件一段时间。 在我打开并锁定文件后,我尝试打开同一个文件只是为了阅读目的。

string filePath = "test.ini";

// Open and lock the file
FileStream configurationFile = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
configurationFile.Lock(1, configurationFile.Length);

// Open the same file just to read it
using (FileStream bufferStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (StreamReader sr = new StreamReader(bufferStream))
    {
        string line;
        while ((line = sr.ReadLine()) != null)    // <--- Here I get the error
        {
            CustomMessageBox.Show(line);
        }
    }
}

我实际上可以使用FileStream和StreamReader打开文件,但是当使用StreamReader与例如sr.ReadLine()时,它会引发异常,该文件正被另一个进程使用。

正如这里提到的Reading a file used by another process [duplicate],FileShare属性应该是ReadWrite,但这并没有帮助。

此外,我已尝试过所有可用的编码,例如StreamReader(bufferStream, Encoding.*),但这些编码也无效。

有什么简单的我可以忽略吗?

2 个答案:

答案 0 :(得分:0)

您正在调用文件流上的Lock,并传递参数以指示您希望锁定整个文件。根据文件,

  

锁定一系列文件流使锁定进程的线程可以独占访问该范围的文件流。

如果您不想锁定文件,请不要致电Lock

答案 1 :(得分:0)

那是因为根据Windows,您正在构建文件的新句柄。 当文件被锁定时,它不允许其他流获取任何其他句柄。你最好像这样修复你的代码:

using (FileStream bufferStream = new FileStream(filePath, FileMode.Open, 
                FileAccess.Read, FileShare.ReadWrite))
{
   bufferStream.Lock(0L, bufferStream.Length);
   using (StreamReader sr = new StreamReader(bufferStream))
   {
       string line;
       while ((line = sr.ReadLine()) != null)    // <--- Here I get the error
       {
         CustomMessageBox.Show(line);
       }
   }

   // dispose lock
   bufferStream.Unlock(0L, bufferStream.Length);
}