【问题标题】:C# open embedded zip-filesC# 打开嵌入式 zip 文件
【发布时间】:2018-06-19 11:00:08
【问题描述】:

我有一个程序需要搜索任意数量的嵌套 zip 文件。我能够在 python 3 中解决这个问题,方法是在给定路径获取存档的名称列表,找到 zip 文件,打开它们,使用 BytesIO 将文件转换为字节字符串,然后在字节字符串上再次递归调用该方法。像这样:

def zip_dig(source_path, posts):

try:
    with zipfile.ZipFile(source_path, 'r') as zip_ref:  # Open initial zip file, list contents
        for name in zip_ref.namelist():
            if re.search(r'\.zip$', name) is not None:
                if name.endswith('.zip'):
                    zfiledata = BytesIO(zip_ref.read(name))
                    zip_dig(zfiledata, posts)
except zipfile.BadZipFile:
    pass
return posts

我现在需要在 C# 中解决这个问题,但我似乎找不到任何等效的解决方案。

我已经广泛搜索并查看了 ZipFile 和 ZipArchive 类的文档,但我似乎无法找到类似的解决方法,因为文件引用以流而不是字符串的形式出现:

internal static List<BsonDocument> ZipDig(string path, List<BsonDocument> posts)
    {
        path = Path.GetFullPath(path);

        using (ZipArchive archive = ZipFile.OpenRead(path))
        {
            foreach (ZipArchiveEntry entry in archive.Entries)
            {
                if (entry.FullName.EndsWith(".zip", StringComparison.OrdinalIgnoreCase))
                {

                    posts = ZipDig(entry, posts);
                }
            }
        }


            return posts;
    }

感谢任何帮助!

编辑:我应该澄清一下,zip 文件通常有几 GB 大,因此从时间消耗的角度来看,提取并不是真正的选择。我只是找到一种特定类型的 txt 文件,读取它们并将内容输入数据库。

【问题讨论】:

    标签: c# zipfile


    【解决方案1】:

    ZipArchive 有一个constructor,它接受一个流。 在递归的初始级别以下使用它。

    【讨论】:

    • 即使是第一级递归并将 File.Open(path) 作为参数传递。
    • 我认为这需要对我的代码进行一些重组,但这肯定会奏效!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多