Я запускаю службу на устройстве и хочу отправить файл этой службе. Достаточно легко, но файл, который я хочу отправить, поступает из 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);
}
}
В коде, который вы опубликовали, ничего не говорится, что объясняет, почему вы получаете другой счет в конце. Итак, что бы ни происходило, это в каком-то коде, который вы не включили, или код, который вы опубликовали, не является фактическим кодом, который вы используете.
Вот некоторый код, который просто открывает.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 для получения информации о том, почему и как это сделать.