2013-05-21 3 views
2

Я хочу сжать некоторые очень большие файлы GML (1-10GB). Я написал для этого метод, но он не работает. Если я распакую его, используя 7-zip для Windows (или что-то еще), я получаю файл, который выглядит плохо в конце (он еще не закончен, XML просто не закончен) ... Я не вижу, что делаю неправильно ...GZipStream с большими файлами не работает

private void CompressFile() 
{ 
    string outputPath = Path.Combine(Path.ChangeExtension(_gmlPath, ".gz")); 

    var buffer = new byte[1024 * 64]; 
    using (var compressing = new GZipStream(File.OpenWrite(outputPath), CompressionMode.Compress)) 
    { 
     using (var file = File.OpenRead(_gmlPath)) 
     { 
      var bytesRead = file.Read(buffer, 0, buffer.Length); 
      while (bytesRead != 0) 
      { 
       compressing.Write(buffer, 0, buffer.Length); 
       bytesRead = file.Read(buffer, 0, buffer.Length); 
      } 
     } 
    } 
} 

[править]

Дополнительный вопрос: Как я могу указать/изменить имя файла, то сжимается внутри GZ? Это имя такое же, как осуществляется ввод, но нет .gml продление: S (есть на входе) ...

+2

в отношении дополнительного вопроса: Если вы измените свой код на 'строку OutputPath = _gmlPath +«.gz»', то вы получите „foo.gml.gz“ вместо «foo.gz», если вход «foo.gml». – dtb

+0

О, это работает :))) Большое вам спасибо! – Nickon

ответ

7
var bytesRead = file.Read(buffer, 0, buffer.Length); 

читает между 1 и 65536 байт, но

compressing.Write(buffer, 0, buffer.Length); 

всегда пишет 65536 байт, поэтому вы попадаете в мусор в файле, если вы читаете меньше 65536 байт.

Напишите только bytesRead много байтов.

compressing.Write(buffer, 0, bytesRead); 
3

Вы должны писать только столько байтов, сколько вы читали в текущей итерации, а не всю длину буфера.

compressing.Write(buffer, 0, bytesRead); 
0

Попробуйте использовать SharpZipLib для того чтобы достигнуть этой цели

Смежные вопросы