2012-06-26 3 views
1

My GZipStream будет только распаковывать первую строку файла. Извлечение содержимого через 7-zip работает, как ожидалось, и дает мне полное содержимое файла. Он также извлекает, как и ожидалось, с помощью gunzip на cygwin и linux, поэтому я ожидаю, что это зависит от O/S (Windows 7).GZipStream только распаковывает первую строку

Я не уверен, как решить проблему, так что все советы по этому помогут мне. Он звучит очень похоже на this, но с использованием SharpZLib получается то же самое.

Вот что я делаю:

var inputFile = String.Format(@"{0}\{1}", inputDir, fileName); 
var outputFile = String.Format(@"{0}\{1}.gz", inputDir, fileName); 
var dcmpFile = String.Format(@"{0}\{1}", outputDir, fileName); 

    using (var input = File.OpenRead(inputFile)) 
    using (var fileOutput = File.Open(outputFile, FileMode.Append)) 
    using (GZipStream gzOutput = new GZipStream(fileOutput, CompressionMode.Compress, true)) 
    { 
     input.CopyTo(gzOutput); 
    } 

// Now, decompress 
using (FileStream of = new FileStream(outputFile, FileMode.Open, FileAccess.Read)) 
using (GZipStream ogz = new GZipStream(of, CompressionMode.Decompress, false)) 
using (FileStream wf = new FileStream(dcmpFile, FileMode.Append, FileAccess.Write)) 
{ 
    ogz.CopyTo(wf); 
} 
+0

В случае, если это имеет значение, я должен также добавить, что, когда я создаю файл, я использую Environment.NewLine(), чтобы разграничить каждую строку. – duckus

ответ

4

Выходной файл только содержит одну строку (с gzip'нутыми) - но она содержит все из других, чем разрывы строк текстовых данных.

Вы повторно вызываете ReadLine(), который возвращает строку текста без разрыва строки и преобразования этого текста в байты. Так что если у вас входной файл, который имел:

abc 
def 
ghi 

Вы бы в конечном итоге с выходной файл, который был сжатая версия

abcdefghi 

Если вы не хотите, что поведение, почему даже пройдите через StreamReader в первую очередь? Просто скопируйте из входного FileStream прямо к GZipStream блока в то время, или использовать Stream.CopyTo, если вы используете .NET 4:

// Note how much simpler the code is using File.* 
using (var input = File.OpenRead(inputFile)) 
using (var fileOutput = File.Open(outputFile, FileMode.Append)) 
using (GZipStream gzOutput = new GZipStream(os, CompressionMode.Compress, true)) 
{ 
    input.CopyTo(gzOutput); 
} 

Также отметим, что добавление в сжатый файл редко бывает хорошей идеей , если у вас нет специальной обработки для нескольких «кусков» в одном файле.

+0

Не похоже, что все содержимое файла сжато в одну строку. Файл проблемы имеет только 630 символов, а содержимое файла совпадает с первой строкой файла, который распаковывается правильно. Тем не менее, я попытаюсь использовать сокращенный фрагмент. – duckus

+0

@duckus: Это не связано с тем, что я видел. Я просто попробовал свой код с тестовым файлом, и он вел себя так, как я ожидал. Я не предполагаю, что у вас есть символ U + 0000, который высмеивает зрителя для распакованного файла? –

+0

В моем исходном файле я разделяю свои столбцы, используя char.ConvertFromUtf32 (1) - для Control-A и ограничивая каждую строку, используя Environment.NewLine(). Я могу попробовать, сжав содержимое из прямого потока, вместо того, чтобы загружать их из файла. Просто посмотреть, произойдет ли то же самое. – duckus