是否可以在 C# 中将文件夹压缩在一起?

Is it possible to zip folders together in c#?

例如,如果我有一个名为 2016 的文件夹,并且该文件夹中有文件夹 Jan-Dec 和其他文件,是否可以将这些文件夹压缩到 2016.zip 中?我尝试将文件夹中的所有文件压缩在一起,但我只想将文件夹压缩在一起,文件夹中没有其他文件。

基本上,2016.zip 2016.zip 中有 Jan-Dec 文件夹,每个文件夹中都有各自的文件,而不是 zip 中的空文件夹。

以下代码抓取以 00 开头的文件,但不抓取文件夹。

// Where the files are located
string strStartPath = txtTargetFolder.Text;

// Where the zip file will be placed
string strZipPath = @"C:\Users\smelmo\Desktop\testFinish\" + strFileNameRoot + "_" + txtDateRange1.Text.Replace(@"/", "_") + "_" + txtDateRange2.Text.Replace(@"/", "_") + ".zip";

if(File.Exists(strZipPath))
{
    File.Delete(strZipPath);
}

using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
{
    foreach (FileInfo file in new DirectoryInfo(strStartPath).GetFiles())
    {
                if (file.Name.StartsWith("00"))
                {
                    var entry = archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name);
                }
    }
}

我也尝试过使用 typeof(),但它无法抓取文件夹或任何东西。

using (ZipArchive archive = ZipFile.Open(strZipPath, ZipArchiveMode.Create))
    {
        foreach (FileInfo file in new DirectoryInfo(strStartPath).GetFiles())
        {
                Type t = file.GetType();
                if (t.Equals(typeof(Directory)))
                {
                    var entry = archive.CreateEntryFromFile(Path.Combine(file.Directory.ToString(), file.Name), file.Name);
                }            
    }

编辑: 为清楚起见添加了详细信息

具有以下文件夹结构:

此代码(已更新):

using System.IO;
using System.IO.Compression;

class Program
{
    static void Main(string[] args)
    {
        string sourceFolder = @"c:\temp";
        string zipFilePath = Path.Combine(sourceFolder, "test.zip");

        // TODO: Check if the archive exists maybe?

        using (ZipArchive archive = ZipFile.Open(zipFilePath, ZipArchiveMode.Create))
        {
            foreach (var directoryName in Directory.GetDirectories(sourceFolder))
            {
                foreach (var filePath in Directory.GetFiles(directoryName))
                {
                    var dirInfo = new DirectoryInfo(directoryName);
                    var fileName = Path.GetFileName(filePath);

                    var entry = archive.CreateEntry($"{dirInfo.Name}\{fileName}");
                }
            }
        }
    }
}

生成此 zip: