4

I can't imagine this is hard to do, but I haven't been able to get it to work. I have a files class that just stores the location, directory, and name of the files I want to zip. The files I'm zipping exist on disk so the FileLocation is the full path. ZipFileDirectory doesn't exist on disk. If I have two items in my files list,

{ FileLocation = "path/file1.doc", ZipFileDirectory = @"\", FileName = "CustomName1.doc" },

{ FileLocation = "path/file2.doc", ZipFileDirectory = @"\NewDirectory", FileName = "CustomName2.doc" }

I would expect to see MyCustomName1.doc in the root, and a folder named NewDirectory containing MyCustomName2.doc, but what happens is they both end up in the root using this code:

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

If I use this:

zip.AddFiles(files.Select(o => o.FileLocation), false, "NewDirectory");

Then it creates the new directory and puts all of the files inside, as expected, but then I lose the ability to use the custom naming with this method, and it also introduces more complexities that the first method would handle perfectly.

Is there a way I can get the first method (AddFile()) to work as I expect?

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
StronglyTyped
  • 2,134
  • 5
  • 28
  • 48
  • I'm looking through the DotNetZip code, and it appears that AddFile() should in fact work as you expect. I was considering the hypothesis that you should set the `FileName` to "NewDirectory\CustomName2.doc" but that is not supported by the code. However, this may be version dependent (perhaps a bug). What version are you using? – phoog Jan 06 '12 at 22:04

2 Answers2

7

On further inspection, since posting a comment a few minutes ago, I suspect that setting FileName is erasing the archive path.

Testing confirms this.

Setting the name to @"NewDirectory\CustomName2.doc" will fix the problem.

You can also use @"\NewDirectory\CustomName2.doc"

phoog
  • 42,068
  • 6
  • 79
  • 117
0

Not sure if this exactly suites your needs but thought I would share. It is a method that is part of a helper class that I created to make working with DotNetZip a bit easier for my dev team. The IOHelper class is another simple helper class that you can ignore.

    /// <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();
        }
    }    
jluebker
  • 61
  • 3