读取未完成的gzip文件

时间:2014-11-19 10:38:42

标签: c# bash cygwin gzip streamreader

我正在远程使用cygwin bash脚本创建一个文件:

(echo $$ > tail.pid; exec tail -f -n+0 --retry FIX.log) | gzip -c >> /faraway/log.gz

同时,在我的本地机器上,我正在使用以下方式阅读/ faraway/log.gz:

    txtFileReader = new StreamReader(new GZipStream(new FileStream(@"log.gz"), FileMode.Open, FileAccess.Read, FileShare.ReadWrite), CompressionMode.Decompress, true));

    bool isDone = false; // Set to true when "done.txt" file appears to signal log.gz is completed

    while (true)  // Read until finished
    {
            if (!isDone)
            {
                if (txtFileReader.Peek() == -1) // Wait if file is still being transferred
                {

                    while (!File.Exists(@"done.txt"))
                    {

                        Thread.Sleep(10000);
                    }
                    isDone = true;

                    // Goes wrong here when gzip closes on remote                       

                }
            }

            if ((line = txtFileReader.ReadLine()) == null)
            {
                    return "";    
            }
    }

我已经在代码中指出了我认为出错的地方。

当(Peek()== -1)并且gzip仍在运行时(即传输数据的速度很慢),下一个ReadLine正常工作,但是当远程关闭gzip时,我的下一个ReadLine不会返回正确的line - 它返回一行的随机部分。

后来,当我zcat该文件时,我看到正确的行被发送。因此,当gzip关闭时,我似乎正在失去gzipstream中的“位置”。

Gzip关闭后会发生什么?它会影响之前写的任何内容吗?

0 个答案:

没有答案