【问题标题】:Creating a zip archive in C# that preserves folder structure在 C# 中创建一个保留文件夹结构的 zip 存档
【发布时间】:2021-07-19 06:20:22
【问题描述】:

我正在努力创建 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.");
        
    }```

【问题讨论】:

标签: c# zip


【解决方案1】:

阅读@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);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2020-04-30
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多