hilda_sonica_vish
hilda_sonica_vish

Reputation: 757

C# -Make a zip file from List of file paths

I have a number of folders and I have number of file in each folders. I am taking some of the file paths from different folders and I need to zip those files into a single zip file.

if I have the file in a single folder, I can do zip using

string startPath = @"c:\example\start";//folder to add
string zipPath = @"c:\example\result.zip";//URL for your ZIP file
ZipFile.CreateFromDirectory(startPath, zipPath, CompressionLevel.Fastest, true);
string extractPath = @"c:\example\extract";//path to extract
ZipFile.ExtractToDirectory(zipPath, extractPath);
using (ZipArchive newFile = ZipFile.Open(zipName, ZipArchiveMode.Create))
{
    foreach (string file in Directory.GetFiles(myPath))
    {
        newFile.CreateEntryFromFile(file);
    }
}

Suppose I don't know about the folders, I only have a list of file paths, I need to foreach through each file path and add into the zip. What should I do for this?

Upvotes: 1

Views: 7044

Answers (2)

hilda_sonica_vish
hilda_sonica_vish

Reputation: 757

Using the DotNetZip library from newget manager, just check whether it will work or not

using (ZipFile zip = new ZipFile())
{
    foreach(var filestring in AllFileArray)
    {
        zip.AddFile(filestring);
    }
    zip.save("MyZipFile.zip")
}

Upvotes: 1

Vadim Martynov
Vadim Martynov

Reputation: 8902

You can enumerate all files in the directory include subdirectories with Directory.GetFiles overloading and SearchOption.AllDirectories option and then use it

String[] allfiles = System.IO.Directory.GetFiles("myPath", "*.*", System.IO.SearchOption.AllDirectories);
foreach (string file in allfiles)
{
    newFile.CreateEntryFromFile(file);
}

You can use ZipFile.CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName) or its overload to create an archive in one step too.

Also there is a way to manipulate zip archive structure more flexibly via Path.GetDirectoryName() method. Here is the example:

foreach(var filePath in files)
{
    var directory = Path.GetDirectoryName(filePath);
    var fileName = Path.GetFileName(filePath);
    var entry = archive.GetEntryFromFile(filePath, $"{directory}/{fileName}");
}

Finally, you can use 3rd party library DotNetZip and solve yor scenario in just 3 lines of code:

using (ZipFile zip = new ZipFile())
{
    zip.AddFiles(files);
    zip.Save("Archive.zip");
}

Upvotes: 4

Related Questions