2014-11-03 71 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

相關問題