2008-10-13 102 views
13

我使用以下代碼,使用SharpZipLib庫將文件添加到.zip文件,但每個文件都以其完整路徑存儲。我只需要將文件存儲在.zip文件的「根目錄」中。SharpLibZip:無路徑添加文件

string[] files = Directory.GetFiles(folderPath); 
using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
{ 
    zipFile.BeginUpdate(); 
    foreach (string file in files) 
    { 
      zipFile.Add(file); 
    } 
    zipFile.CommitUpdate(); 
} 

我在提供的文檔中找不到關於此選項的任何信息。由於這是一個非常受歡迎的圖書館,我希望有人閱讀此文可能會知道某些內容

回答

21

我的解決辦法是設置NameTransform對象屬性將ZipFile設置爲ZipNameTransform,其TrimPrefix設置爲文件的目錄。這會導致條目名稱的目錄部分(全文件路徑)被刪除。

public static void ZipFolderContents(string folderPath, string zipFilePath) 
{ 
    string[] files = Directory.GetFiles(folderPath); 
    using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
    { 
     zipFile.NameTransform = new ZipNameTransform(folderPath); 
     foreach (string file in files) 
     { 
      zipFile.BeginUpdate(); 
      zipFile.Add(file); 
      zipFile.CommitUpdate(); 
     } 
    } 
} 

什麼是酷是在NameTransform屬性爲INameTransform型的,允許名稱的定製轉變。

10

如何使用System.IO.Path.GetFileName()結合ZipFile.Add()的entryName參數?

string[] files = Directory.GetFiles(folderPath); 
using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
{ 
    zipFile.BeginUpdate(); 
    foreach (string file in files) 
    { 
      zipFile.Add(file, System.IO.Path.GetFileName(file)); 
    } 
    zipFile.CommitUpdate(); 
} 
+1

根據名稱添加文件時,ZipFile.Add()的entryName參數沒有重載,但我喜歡你的想法。請參閱下面的答案。 – ProfK 2008-10-13 18:12:29

+2

你有最新版本的圖書館嗎?它有一個file.add – rjrapson 2008-10-13 20:11:07

+2

超載。我很確定有,至少在最新版本。 – 2008-10-14 09:02:46

3

Directory.GetFiles()的MSDN項規定,返回的文件名附加到提供的路徑參數。http://msdn.microsoft.com/en-us/library/07wt70x2.aspx),所以傳遞給zipFile.Add()的字符串包含路徑。

按照SharpZipLib文檔,有Add方法的重載,

public void Add(string fileName, string entryName) 
Parameters: 
    fileName(String) The name of the file to add. 
    entryName (String) The name to use for the ZipEntry on the Zip file created. 

試試這個辦法:

string[] files = Directory.GetFiles(folderPath); 
using (ZipFile zipFile = ZipFile.Create(zipFilePath)) 
{ 
    zipFile.BeginUpdate(); 
    foreach (string file in files) 
    { 
      zipFile.Add(file, Path.GetFileName(file)); 
    } 
    zipFile.CommitUpdate(); 
}