C# - 从文件路径列表中获取一个zip文件

时间:2017-02-10 06:06:07

标签: c# asp.net-mvc

我有很多文件夹,每个文件夹中都有一些文件。 我正在从不同的文件夹中获取一些文件路径,我需要将这些文件压缩成一个zip文件。

如果我将文件放在一个文件夹中,我可以使用

进行压缩
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);
    }
}

假设我不知道文件夹,我只有一个文件路径列表,我需要遍历每个文件路径并添加到zip中。我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用Directory.GetFiles重载和SearchOption.AllDirectories选项枚举目录包含子目录中的所有文件,然后使用它

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

您可以使用ZipFile.CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName)或其重载来一步创建存档。

还有一种方法可以通过Path.GetDirectoryName()方法更灵活地操作zip存档结构。这是一个例子:

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

最后,你可以使用第三方库DotNetZip并只用3行代码解决你的场景:

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

答案 1 :(得分:1)

使用newget manager中的DotNetZip库,只需检查它是否可行

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