【问题标题】:GZip Decompression Gives Blank FileGZip解压得到空白文件
【发布时间】:2011-06-15 07:15:29
【问题描述】:

鉴于下面的代码,为什么解压不起作用? “NewFile2.txt”应该有原始的、解压缩的文本,但文件只是空白。

ioTests.CompressFile(@"c:\newfile.txt", @"c:\newfile.txt.gz");
ioTests.DecompressFile(@"c:\newfile.txt.gz", @"c:\newfile2.txt");

public void CompressFile(string inFileName, string outFileName)
{
    FileStream inFile = new FileStream(inFileName, FileMode.Open);
    FileStream outFile = new FileStream(outFileName, FileMode.Create);

    GZipStream compStream = new GZipStream(outFile, CompressionMode.Compress);

    int theByte = inFile.ReadByte();

    while (theByte != -1)
    {
        compStream.WriteByte((byte)theByte);
        theByte = inFile.ReadByte();
    }

    compStream.Close();
}

public void DecompressFile(string inFileName, string outFileName)
{
    FileStream inFile = new FileStream(inFileName, FileMode.Open);
    FileStream outFile = new FileStream(outFileName, FileMode.CreateNew);

    GZipStream compStream = new GZipStream(inFile, CompressionMode.Decompress);

    int theByte = compStream.ReadByte();

    while (theByte != -1)
    {
        outFile.WriteByte((byte)theByte);

        theByte = compStream.ReadByte();
    }

    compStream.Close();
}

【问题讨论】:

  • 你不应该将解压缩文件写入“outFile”吗?
  • @ssg:是的,这就是我正在做的事情(我认为)。输出文件是来自(现在)未压缩压缩流字节(保存在theByte 中)的WriteByteing。

标签: c# .net gzipstream


【解决方案1】:
outFile.Flush(); // after your loop

【讨论】:

  • 今晚你是我最喜欢的家伙!谢谢!那行得通! (我真是个白痴,没有看到这一点。我正瞪大眼睛)
  • @Richard:大声笑,我们在夜间编码时都会做这种废话:P
【解决方案2】:

我更喜欢

outFile.Close() 

因为它刷新流并调用 Dispose 方法,释放分配的资源。

【讨论】:

  • 这实际上是我所做的。但瓦利德说得对,溪流没有冲水。
【解决方案3】:

由于你使用的流实现了IDisposable interface,你应该Dispose() / Close() 你的类,或者使用using 语句自动执行此操作:

    using (FileStream inFile = new FileStream(inFileName, FileMode.Open))
    using (FileStream outFile = new FileStream(outFileName, FileMode.Create))

    using (GZipStream compStream = new GZipStream(outFile, CompressionMode.Compress)) {

        int theByte = inFile.ReadByte();
        // ... Rest of your code

    }

这大致翻译为:

    try {
       FileStream inFile = new FileStream(inFileName, FileMode.Open);
       FileStream outFile = new FileStream(outFileName, FileMode.Create);
       GZipStream compStream = new GZipStream(outFile, CompressionMode.Compress);

        int theByte = inFile.ReadByte();
        // ... Rest of your code

    } finally {
        if (inFile != null) inFile.Dispose();
        if (outFile != null) outFile.Dispose();
        if (compStream != null) compStream.Dispose();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-01
    • 2015-09-01
    • 2014-10-21
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多