2011-03-14 68 views
2

我有一個負載已被壓縮不正確的傳統拉鍊。由於Zip文件使用代替SharpZipLib問題,而不是/

文件被保存在zip文件中,因此它們是文件夾\文件名而不是文件夾/文件名。

這也就意味着這樣的代碼:

using (ZipFile zipFile = new ZipFile(@"zippath.zip")) 
{ 
    for (int i = 0; i < zipFile.Count; i++) 
    { 
      var entry = zipFile[i]; 
      zipFile.BeginUpdate(); 
      zipFile.Delete(entry); 
      zipFile.CommitUpdate(); 

... 

拋出一個

找不到入口刪除

這是一個已知的問題發現here但不幸的是我有沒有控制拉鍊是如何製作的,並且我需要使用多年的zip文件。有沒有一種方法可以修復刪除語句或在使用前修復(在C#中)壓縮文件?

謝謝!

回答

0

看起來修復程序位於您自己的底部link。其中一位開發人員用一些代碼編寫了一篇文章,簡單地用/替換了\字符。試試看,也許從那裏你可以刪除zip條目。

+0

該解決方案是在創建時間zip文件不是在它的閱讀。 – 2011-03-14 22:25:16

2

ZipEntry內部有一個公共函數,用於爲您清理名稱。 「ZipEntry.CleanName(yourstring)」。在添加條目並嘗試刪除條目時進行此調用。 注:如果您正在使用此文件路徑,將正確解釋的zip文件的路徑,即使CleanName函數替換「\」和「/」

**

ADDING的ZipEntry

**

zipEntryKey = file.FullName.Replace(file.Directory.Root.ToString(), string.Empty); 
zipEntryKey = ZipEntry.CleanName(zipEntryKey); 
ZipEntry entry = new ZipEntry(zipEntryKey); 
entry.DateTime = file.LastWriteTime; 


Stream fileStream = Minify(file); 
byte[] buffer = new byte[fileStream.Length]; 
entry.Size = fileStream.Length; 
fileStream.Read(buffer, 0, buffer.Length); 
fileStream.Close(); 

zipStream.PutNextEntry(entry); 
zipStream.Write(buffer, 0, buffer.Length); 
zipStream.CloseEntry(); 

DELETING的ZipEntry

zipEntryKey = file.FullName.Replace(file.Directory.Root.ToString(), string.Empty); 
zipEntryKey = ZipEntry.CleanName(zipEntryKey); 

if (existingZip.FindEntry(zipEntryKey, true) > -1) 
{ 
    existingZip.BeginUpdate(); 
    ZipEntry Existing = existingZip[existingZip.FindEntry(zipEntryKey, true)]; 
    existingZip.Delete(Existing); 
    existingZip.CommitUpdate(); 
}