ZipArchiveEntry Length возвращает неправильный размер?

1

Я запускаю службу на устройстве и хочу отправить файл этой службе. Достаточно легко, но файл, который я хочу отправить, поступает из zip файла, и это то, где вещи становятся сложными для меня. Я пытаюсь достичь своей цели, посылая поток внутреннего файла на устройство, но потом мне пришлось понять, что я отправляю 12 байтов (что, кстати, является длиной внутреннего имени файла с расширением - совпадением? ) больше, чем GetEntry(). Длина указывает.

Я что-то упустил, или что я делаю неправильно? Это текущий код, как есть (Примечание: клиент является действительным и подключенным tcp-socket в этот момент):

    System.IO.Compression.ZipArchive zfile = System.IO.Compression.ZipFile.Open(_STR_FILENAME, System.IO.Compression.ZipArchiveMode.Read);
    System.IO.Compression.ZipArchiveEntry zentry = zfile.GetEntry(_STR_FWNAME);
    using (Stream fs = zentry.Open())
    {
        using(NetworkStream ns = new NetworkStream(client))
        {
            int i, counter = 0;

            while((i = fs.ReadByte()) != -1)
            {
                ns.WriteByte((byte)i);
                counter++;
            }

            Console.WriteLine("BYTES: " + counter);
            Console.WriteLine("LENGTH FILE: " + zentry.Length);
        }   
    }
  • 0
    Я не вижу ошибку, но у меня нет мотивации для поиска, потому что вы можете просто использовать fs.CopyTo (ns).
  • 0
    SW не используется. Удалите это.
Показать ещё 2 комментария
Теги:
zipfile
stream

1 ответ

0

В коде, который вы опубликовали, ничего не говорится, что объясняет, почему вы получаете другой счет в конце. Итак, что бы ни происходило, это в каком-то коде, который вы не включили, или код, который вы опубликовали, не является фактическим кодом, который вы используете.

Вот некоторый код, который просто открывает.zip файл и показывает сохраненную длину рядом с фактическими байтами, которые можно прочитать из сохраненного потока:

static void CheckZipEntries(string fileName)
{
    using (Stream inputStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Delete))
    using (ZipArchive archive = new ZipArchive(inputStream, ZipArchiveMode.Read))
    {
        foreach (ZipArchiveEntry entry in archive.Entries)
        {
            using (Stream entryStream = entry.Open())
            {
                Console.WriteLine("Entry length: {0},   Stream length: {1}",
                    entry.Length, GetStreamLength(entryStream));
            }
        }
    }
}

static int GetStreamLength(Stream stream)
{
    int count = 0, bytesRead;
    byte[] rgb = new byte[1024];

    while ((bytesRead = stream.Read(rgb, 0, rgb.Length)) > 0)
    {
        count += bytesRead;
    }

    return count;
}

Когда я запускаю это на любом количестве.zip файлов, оба числа для каждой записи в архиве идентичны друг другу.

Итак, я думаю, что ответ на ваш вопрос: нет, на самом деле это не так. :)

Если этот ответ не дает достаточной информации, чтобы быть полезной, тогда вы должны опубликовать хороший пример кода, который является полным, но не более чем абсолютно необходимым. См. Https://stackoverflow.com/help/mcve для получения информации о том, почему и как это сделать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню