#c# #.net #gzipstream
#c# #.net #gzipstream
Вопрос:
Мне нужно получить файл с моего сервера по FTP в поток памяти, а затем распаковать его, чтобы я мог с ним дальше работать.
Я делаю следующее, но распакованный файл каждый раз усекается.
Я вижу, что FTP-часть работает правильно (я проверил, что ms.Длина равна правильному размеру файла на сервере (около 700 КБ)).
res.Length составляет всего около 400 КБ, но должно быть около 10 МБ. (также я могу видеть в консоли.Строка записи (res) указывает на то, что файл усечен).
Затем я получаю MemoryStream из моего FTP-кода…
var decompress = new GZipStream(ms, CompressionMode.Decompress);
using (var sr = new StreamReader(decompress))
{
var res = sr.ReadToEnd();
Console.WriteLine(res);
}
Комментарии:
1. Либо сервер уже отправляет некоторые поврежденные данные, данные повреждаются при передаче, либо сжатые данные используют метод сжатия, не полностью поддерживаемый GZipStream. Предложение: Загрузите файл вручную (с помощью FTP-клиента) и попробуйте распаковать его с помощью какой-либо надежной / известной утилиты сжатия. Если с файлом все в порядке, попробуйте загрузить файл через свою программу, но вместо использования MemoryStream запишите загруженные данные в файл. Затем снова попробуйте распаковать этот файл с помощью надежной / известной утилиты сжатия…
2. Также проверьте, действительно ли файл Gzip является объединенным Gzip. Я не знаю, может ли GZipStream обрабатывать объединенный Gzip или нет, но это может быть еще одним возможным сценарием проблемы для проверки (если GZipStream не сможет обрабатывать объединенный Gzip, он будет извлекать только первый поток gzip в объединенный gzip, что, возможно, объясняет, почему вы получаете только часть распакованных данных)
3. Я вручную загрузил и распаковал gunzip с помощью CygWin, и файл был завершен. Также я вижу, что сервер отправляет правильные данные при совпадении размера файла. Итак, я знаю, что FTP-часть моего кода в порядке. Это может быть связанная ситуация с Gzip, поскольку файл представляет собой архивированный файл журнала, который добавляется каждый день и, таким образом, разрастается до журнала за месяц. Также, когда я распаковываю свой код, я вижу, что на самом деле у меня есть журнал только за один день, поэтому я думаю, вы правы в том, что это связанная проблема с Gzip. Похоже, это известная проблема github.com/dotnet/corefx/issues/27279