SharpLibZip: добавить файл без пути

Я использую следующий код, используя библиотеку 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();
}

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

Ответы

Ответ 1

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

Ответ 2

Как насчет использования 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();
}

Ответ 3

В записи 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();
}