我无法想象这很难做到,但我无法让它发挥作用。我有一个文件类,只存储我想要压缩的文件的位置,目录和名称。我正在压缩的文件存在于磁盘上,因此FileLocation是完整路径。 ZipFileDirectory在磁盘上不存在。如果我的文件列表中有两个项目,
{ FileLocation = "path/file1.doc", ZipFileDirectory = @"\", FileName = "CustomName1.doc" },
{ FileLocation = "path/file2.doc", ZipFileDirectory = @"\NewDirectory", FileName = "CustomName2.doc" }
我希望在根目录中看到MyCustomName1.doc,以及包含MyCustomName2.doc的名为NewDirectory的文件夹,但会发生的是它们都使用此代码在根目录中结束:
using (var zip = new Ionic.Zip.ZipFile())
{
foreach (var file in files)
{
zip.AddFile(file.FileLocation, file.ZipFileDirectory).FileName = file.FileName;
}
zip.Save(HttpContext.Current.Response.OutputStream);
}
如果我使用它:
zip.AddFiles(files.Select(o => o.FileLocation), false, "NewDirectory");
然后它会创建新目录并按预期将所有文件放入其中,但后来我无法使用此方法使用自定义命名,并且它还引入了第一种方法可以完美处理的更复杂的问题。 / p>
有没有办法让第一种方法(AddFile())按预期工作?
答案 0 :(得分:7)
在进一步检查时,由于几分钟前发表评论,我怀疑设置FileName
正在删除存档路径。
测试证实了这一点。
将名称设置为@“NewDirectory \ CustomName2.doc”将解决问题。
您也可以使用@“\ NewDirectory \ CustomName2.doc”
答案 1 :(得分:0)
不确定这是否完全满足您的需求,但我想我会分享。这是一个方法,它是我创建的帮助类的一部分,使我的开发团队更容易使用DotNetZip。 IOHelper类是另一个你可以忽略的简单助手类。
/// <summary>
/// Create a zip file adding all of the specified files.
/// The files are added at the specified directory path in the zip file.
/// </summary>
/// <remarks>
/// If the zip file exists then the file will be added to it.
/// If the file already exists in the zip file an exception will be thrown.
/// </remarks>
/// <param name="filePaths">A collection of paths to files to be added to the zip.</param>
/// <param name="zipFilePath">The fully-qualified path of the zip file to be created.</param>
/// <param name="directoryPathInZip">The directory within the zip file where the file will be placed.
/// Ex. specifying "files\\docs" will add the file(s) to the files\docs directory in the zip file.</param>
/// <param name="deleteExisting">Delete the zip file if it already exists.</param>
public void CreateZipFile(ICollection<FileInfo> filePaths, string zipFilePath, string directoryPathInZip, bool deleteExisting)
{
if (deleteExisting)
{
IOHelper ioHelper = new IOHelper();
ioHelper.DeleteFile(zipFilePath);
}
using (ZipFile zip = new ZipFile(zipFilePath))
{
foreach (FileInfo filePath in filePaths)
{
zip.AddFile(filePath.FullName, directoryPathInZip);
}
zip.Save();
}
}