2015-06-06 16 views
0

У меня есть файл с 10 строками, я сжимаю формат Bz2, но когда я его распакую, я вижу, что сгенерированный файл имеет только 9 строк. Потеря данных составляет 1,5 строки. Вот мой код для сжатия в Bz2. Im, используя DotNet zip Library https://dotnetzip.codeplex.com/Невозможно распаковать файл Bz2 имеет исходный файл с использованием библиотеки Dotnetzip

Ниже приведен код сжатия, я конвертирую файл в файлы UTF-8 и Bz2.

static string Compress(string sourceFile, bool forceOverwrite) 
    { 
     var outFname = fname + ".bz2"; 

     if (File.Exists(outFname)) 
     { 
      if (forceOverwrite) 
       File.Delete(outFname); 
      else 
       return null; 
     } 
     long rowCount = 0; 
     var output = File.Create(outFname); 

     try 
     { 
       using (StreamReader reader = new StreamReader(fname)) 
      { 
       using (var compressor = new Ionic.BZip2.ParallelBZip2OutputStream(output)) 
       { 
        StreamWriter writer = new StreamWriter(compressor, System.Text.Encoding.UTF8); 
        string line = ""; 
        while ((line = reader.ReadLine()) != null) 
        { 
         writer.WriteLine(line); 
         rowCount++; 

         if (rowCount % 100000 == 0) 
          Console.WriteLine("InProgress..Current Row # " + rowCount.ToString()); 
        } 

       } 
      } 
     } 
     catch (Exception) 
     { 

      throw; 
     } 
     finally 
     { 
      if (output != null) 
       output = null; 
     } 

     //  Pump(fs, compressor); 

     return outFname; 
    } 

Я устал, чтобы изменить метод чтения, как показано ниже

  // int charsRead; 
        // char[] buffer = new char[2048]; 
        // while ((charsRead = reader.ReadBlock(buffer, 0, buffer.Length)) > 0) 
        // { 
        //  writer.Write(buffer, 0, charsRead); 
        //  rowCount++; 

        //  if (rowCount % 100000 == 0) 
        //   Console.WriteLine("InProgress..Current Row # " + rowCount.ToString()); 
        // } 

Для декомпрессия, вот код

public static string Decompress(string fname, bool forceOverwrite) 
    { 
     var outFname = Path.GetFileNameWithoutExtension(fname); 
     if (File.Exists(outFname)) 
     { 
      if (forceOverwrite) 
       File.Delete(outFname); 
      else 
       return null; 
     } 

     using (Stream fs = File.OpenRead(fname), 
       output = File.Create(outFname), 
       decompressor = new Ionic.BZip2.BZip2InputStream(fs)) 
      Pump(decompressor, output); 

     return outFname; 
    } 

    private static void Pump(Stream src, Stream dest) 
    { 
     byte[] buffer = new byte[2048]; 
     int n; 
     while ((n = src.Read(buffer, 0, buffer.Length)) > 0) 
      dest.Write(buffer, 0, n); 

    } 

Во время отладки я вижу Readline правильно читает данные, не уверены в том, это ошибка в этой библиотеке dll в преобразовании фактического файла в Bz2 или чтение из Bz2. Пожалуйста, дайте мне знать причину этой проблемы

ответ

0

Рекомендовать вы получите DotNetZip здесь: https://www.nuget.org/packages/DotNetZip/

я должен был добавить следующие две строки в методе Сжать непосредственно после цикла.

writer.Close(); 
compressor.Close(); 

В противном случае ваш код генерирует исключение. После этого ваш код работал нормально для 10-строчного текстового файла, который я использовал. Отсутствуют отсутствующие данные.

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

  • Нет связанных вопросов^_^