如何在C#中没有根目录的情况下压缩一些文件和目录?

时间:2016-10-22 13:58:08

标签: c# directory zip compression roku

如何在C#中没有根目录的情况下压缩某些文件和目录?

我目前正在编写一个程序,通过HTTP自动将应用程序侧载到Roku。我已经成功编写了所有软件,除了压缩源文件的部分。 Roku需要提供一个zip文件,其中包含应用程序的源文件,位于zip文件树的顶层。我的第一直觉是使用像ZipFile.CreateFromDirectory(source, output);这样的ZipFile类。这确实压缩了文件和目录,但它还包含source目录作为zip中的顶级文件。这意味着我的所有源文件和目录都不在文件的顶层,就像Roku需要的那样。

我尝试这样做的另一种方法是使用ZipArchive class / extension methods。但是,有了这个我无法向zip添加目录,所以这也不合适。

要在制作zip文件时在Windows上解决此问题,您必须选择实际的文件和目录,然后选择Send to - Compressed (zipped) folder对包含它们的文件执行此操作(示例其中显示如下:

问题:

有没有办法将文件和目录压缩到c#中的zip文件,其中这些文件和目录将位于zip文件树的顶部?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

试试这个:

static bool AddDirectory(this ZipArchive archive, int rootLength, string directory)
{
    bool hasFiles = false;
    foreach (var entry in Directory.GetFileSystemEntries(directory))
    {
        string relativePath = entry.Substring(rootLength);
        if (Directory.Exists(entry))
        {
            if (!archive.AddDirectory(rootLength, entry))
            {
                archive.CreateEntry(relativePath + "/");
            }
        }
        else
        {
            archive.CreateEntryFromFile(entry, relativePath);
            hasFiles = true;
        }
    }
    return hasFiles;
}

public static void AddDirectoryWithoutRoot(this ZipArchive archive, string directory)
{
    int pathRootLength = (directory.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar).Length;
    archive.AddDirectory(pathRootLength, directory);
    archive.CreateEntry("/");
}

用法:

using (var fs = File.Create("test.zip"))
{
    ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Create);
    archive.AddDirectoryWithoutRoot(@"C:\your\path");
}