SharpLibZip: добавить файл без пути - PullRequest
14 голосов
/ 13 октября 2008

Я использую следующий код, используя библиотеку SharpZipLib , чтобы добавить файлы в файл .zip, но каждый файл хранится со своим полным путем. Мне нужно только сохранить файл в «корне» .zip файла.

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

Я не могу найти что-либо об опциях для этого в прилагаемой документации. Поскольку это очень популярная библиотека, я надеюсь, что кто-то, читающий это, может что-то знать.

Ответы [ 3 ]

22 голосов
/ 14 октября 2008

Мое решение состояло в том, чтобы установить для свойства 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, позволяющее настраивать преобразования имен.

11 голосов
/ 13 октября 2008

Как насчет использования System.IO.Path.GetFileName () в сочетании с параметром entryName ZipFile.Add ()?

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();
}
4 голосов
/ 13 октября 2008

В записи MSDN для Directory.GetFiles() указано, что Возвращенные имена файлов добавляются к предоставленному параметру пути. (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();
}
...