C # Чтение Zip-файлов с помощью FileStream - PullRequest
2 голосов
/ 12 января 2009

Я написал программу, которая установит сетевое соединение с удаленным компьютером с использованием TCPClient. Я использую ее для передачи файлов по 100 тыс. Ч. В удаленное приложение .net, а затем inturn записывает их в HardDrive. Все передачи файлов работают хорошо, за исключением случаев, когда речь идет о ZIP-файлах. Любопытно отметить, что повторно собранный файл всегда имеет размер 98 КБ. Существует ли какой-то темный секрет для ZIP-файлов, который препятствует их обработке таким образом. Опять же, все другие передачи файлов работают нормально, изображения, XLS, TXT, CHM, EXE и т. Д.

Confused

Ответы [ 3 ]

3 голосов
/ 12 января 2009

Ну, вы не показали ни одного кода, поэтому сложно сказать, что именно не так.

Обычная ошибка состоит в том, что Stream.Read считывает все данные, которые вы запрашиваете, вместо того, чтобы понимать, что он может прочитать меньше, но что его значение на самом деле читается как возвращаемое значение.

Другими словами, код не должен быть:

byte[] buffer = new byte[input.Length];
input.Read(buffer, 0, buffer.Length);
output.Write(buffer, 0, buffer.Length);

но что-то вроде:

byte[] buffer = new byte[32 * 1024];
int bytesRead;
while ( (bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
    output.Write(buffer, 0, bytesRead);
}

Но это только предположение. Если бы вы могли опубликовать некоторый код, у нас был бы лучший шанс выяснить это.

1 голос
/ 12 января 2009

Фактический код будет полезен.

Вы используете BinaryReader / BinaryWriter?

(т.е. на основе данных, а не на основе текста).

Вы можете попробовать использовать шестнадцатеричное сравнение файлов (например, Beyond Compare ), чтобы сравнить оригинал и копию и посмотреть, дает ли это какие-либо подсказки.

0 голосов
/ 12 января 2009

Возможно, вы перезаписываете (а не добавляете) существующий файл с каждым полученным чанком? Поэтому окончательный размер файла будет <= размер одного куска. </p>

Но без какого-либо кода трудно определить причину проблемы.

...