2014-11-03 34 views
1

我正在设备上运行服务,并希望将文件发送到该服务。很简单,但我想发送的文件来自一个zip文件,这是对我来说变得复杂的地方。 我试图通过发送内部文件的流到设备来实现我的目标,但后来我不得不意识到,我发送了12个字节(顺便说一下是内部文件名的长度 - 扩展名 - 巧合?)超过GetEntry()。长度将指示。ZipArchiveEntry的长度是否返回错误的大小?

我完全错过了什么,或者我做错了什么? 这是当前的代码,因为它是(注:客户端是在这一点上有效的和连接的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); 
     } 
    } 
+0

我没有看到这个错误,但我没有动机去搜索,因为你可以使用fs.CopyTo(ns)。 – usr 2014-11-03 11:55:01

+0

sw未使用。删除它。 – usr 2014-11-03 11:55:22

+0

@usr删除了未使用的streamwriter以及未使用的缓冲区。感谢指出这一点。还要感谢CopyTo-Approach,但仍然是一个问题 - 为什么fs的长度与Entry.Length的长度没有相同? – Daniel 2014-11-03 12:09:37

回答

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

相关问题