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();
}