我正在设备上运行一项服务,并希望将文件发送到该服务。很简单,但我要发送的文件来自 zip 文件,这对我来说是复杂的地方。 我试图通过将内部文件的流发送到设备来实现我的目标,但后来我不得不意识到我正在发送 12 个字节(顺便说一下,这是带扩展名的内部文件名的长度 - 巧合吗? ) 超过 GetEntry().Length 指示的长度。
我完全错过了什么还是我做错了什么? 这是当前代码(注意:此时客户端是有效且已连接的 TCP 套接字):
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 文件上运行此命令时,每个存档条目的两个数字彼此相同。
所以,我想你问题的答案是,不,它实际上并没有这样做。