У меня есть файл с 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. Пожалуйста, дайте мне знать причину этой проблемы