我目前正在编写一个程序,通过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文件树的顶部?任何帮助表示赞赏。
答案 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");
}