我正在远程使用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关闭后会发生什么?它会影响之前写的任何内容吗?