从C#中不断增长的文件中读取?

Rob*_*ser 16 .net c# windows streaming filestream

在C#/ .NET(在Windows上)有没有办法使用文件流读取"增长"文件?打开文件流时文件的长度将非常小,但该文件将由另一个线程写入.如果/当文件流"赶上"到另一个线程时(即Read()返回0字节读取时),我想暂停以允许文件缓冲一点,然后继续读取.

我真的不想使用a FilesystemWatcher并继续创建新的文件流(如日志文件所建议的那样),因为这不是一个日志文件(它是一个即时编码的视频文件),性能是个问题.

谢谢,
罗伯特

Vin*_*jip 6

您可以这样做,但是您需要使用Stream.Seek线程之间的适当同步来仔细跟踪文件读取和写入位置.通常,您将使用其EventWaitHandle子类或子类来执行数据同步,并且您还需要考虑同步访问FileStream对象本身(可能通过lock语句).

更新:在回答这个问题时,我实现了类似的东西 - 在后台下载文件并同时上传的情况.我使用了内存缓冲区,并发布了一个有工作代码的要点.(这是GPL,但这对你来说可能无关紧要 - 无论如何你可以用这些原则来做你自己的事情.)


Jes*_*ron 5

这与围绕文件的 StreamReader 一起使用,步骤如下:

  1. 在写入文件的程序中,使用读共享打开它,如下所示:

    var out = new StreamWriter(File.Open("logFile.txt",  FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在读取文件的程序中,以读写共享的方式打开,像这样:

    using (FileStream fileStream = File.Open("logFile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using ( var file = new StreamReader(fileStream))
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在访问输入流之前,请检查是否已到达末尾,如果已到达,请稍等片刻。

    while (file.EndOfStream)
    {
        Thread.Sleep(5);
    }
    
    Run Code Online (Sandbox Code Playgroud)