[英]Creating a logical folder structure when creating a 7-Zip archive via the command-line
[英]Creating a zip archive in C# that preserves folder structure
我正在努力创建 zip 档案,并且可以使用来自更有经验的编码员的一些指导。 我正在尝试使用以下方法创建 800 个文件夹和子文件夹以及大约 8,000 个文件的 zip 存档。 到目前为止,这段代码可以创建一个存档,但没有内部目录结构。 所有 8,000 个文件都存储在 zip 中的单个平面列表中。 有没有办法做到这一点,使其类似于典型的 zip 存档,因为文件夹结构也存储在 zip 文件中? 我知道 ZipFile.CreateFromDirectory() 方法 [它确实保留了文件夹结构] 但不想使用它,因为它在文件被锁定时失败。 我也知道还有其他库,但如果可能的话,我想使用 C# 库。 任何指导将不胜感激。 谢谢你。
{
SearchOption searchOption = SearchOption.AllDirectories;
IEnumerable<string> fileSystem;
fileSystem = Directory.EnumerateFileSystemEntries(_zipRoot, "*.*", searchOption);
using (ZipArchive archive = ZipFile.Open(_zipPath, ZipArchiveMode.Create))
{
foreach (var fPath in fileSystem)
{
try
{
archive.CreateEntryFromFile(fPath,Path.GetFileName(fPath));
}
catch
{
FailedFiles.Add(fPath);
Debug.Log(fPath);
}
}
}
Debug.Log($"{FailedFiles.Count} files failed to archive.");
}```
在阅读了@mjwills 发布的讨论几种方法的线程后,@Curti 建议的以下代码就像一个魅力。
public static void StructuredZip(this ZipArchive archive, string sourceDirName, CompressionLevel compressionLevel = CompressionLevel.Fastest)
{
int fileCount = 0;
int folderCount = 0;
int failedCount = 0;
var folders = new Stack<string>();
folders.Push(sourceDirName);
do
{
var currentFolder = folders.Pop();
folderCount++;
foreach (var item in Directory.GetFiles(currentFolder))
{
try
{
archive.CreateEntryFromFile(item, item.Substring(sourceDirName.Length + 1),
compressionLevel);
fileCount++;
}
catch
{
failedCount++;
}
}
foreach (var item in Directory.GetDirectories(currentFolder))
{
folders.Push(item);
}
}
while (folders.Count > 0);
Debug.Log($"Archived {fileCount} in {folderCount} folders. There were {failedCount} failed files!");
}
}
using (var zip = ZipFile.Open(_zipPath, ZipArchiveMode.Create))
{
zip.StructuredZip(_zipRoot);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.