GZip распаковка дает пустой файл - PullRequest
1 голос
/ 15 июня 2011

Учитывая код ниже, почему декомпрессия не работает? Файл «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();
}

Ответы [ 3 ]

4 голосов
/ 15 июня 2011
outFile.Flush(); // after your loop
2 голосов
/ 15 июня 2011

Поскольку используемые вами потоки реализуют интерфейс IDisposable , вам следует 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();
    }
2 голосов
/ 15 июня 2011

Я предпочитаю

outFile.Close() 

, поскольку это очищает поток и вызывает метод Dispose, освобождая выделенные ресурсы.

...