誰能告訴我爲什麼下面的代碼不起作用?我正在使用SharpZipLib API用於Zip流,這是目前從他們的網站上DL'ed的最新版本。我試圖使用這個邏輯來合併一個zip文件的內容到另一個,而不必在磁盤上執行IO,因爲預期的zip文件可能包含保留的windows文件名。我已經嘗試過使用多個不同的源和目標zip文件(包含保留名稱和不包含這些名稱的文件)。代碼不會拋出任何異常,並且如果在每次寫入操作之前檢查緩衝區,則可以看到它包含真實數據,但在整個操作完成後,目標zip文件的大小沒有改變,您可以探索它確認沒有新文件(代碼應該添加的文件)實際上已添加到目標文件。 :(將zip條目提取到另一個Zip文件
public static void CopyToZip(string inArchive, string outArchive)
{
ZipOutputStream outStream = null;
ZipInputStream inStream = null;
try
{
outStream = new ZipOutputStream(File.OpenWrite(outArchive));
outStream.IsStreamOwner = false;
inStream = new ZipInputStream(File.OpenRead(inArchive));
ZipEntry currentEntry = inStream.GetNextEntry();
while (currentEntry != null)
{
byte[] buffer = new byte[1024];
ZipEntry newEntry = new ZipEntry(currentEntry.Name);
newEntry.Size = currentEntry.Size;
newEntry.DateTime = currentEntry.DateTime;
outStream.PutNextEntry(newEntry);
int size = 0;
while ((size = inStream.Read(buffer, 0, buffer.Length)) > 0)
{
outStream.Write(buffer, 0, size);
}
outStream.CloseEntry();
currentEntry = inStream.GetNextEntry();
}
outStream.IsStreamOwner = true;
}
catch (Exception e)
{
throw e;
}
finally
{
try { outStream.Close(); }
catch (Exception ignore) { }
try { inStream.Close(); }
catch (Exception ignore) { }
}
}
我遵循這些示例來創建我在此處發佈的代碼。此時不管它是否覆蓋,上面的代碼根本不會改變目標zip文件的狀態。如果它是覆蓋,至少我會有東西來調試......我不需要使用memeory流。我的意思是「不使用磁盤」是因爲我無法將一個zip文件的內容提取到硬盤上,然後將其重新打包到另一個zip文件中。由於windows文件的命名規則,它必須從一個zip文件移動到下一個文件,而不需要在HD上解壓縮。 – 2012-08-07 21:38:59
我使用了File.OpwnWrite()的新FileStream(outArchive,FileMode.Open)。它根本沒有改變結果。 – 2012-08-07 21:45:43