V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1462326016
V2EX  ›  C#

C#/ Python 调用 7z.dll 加解密方法,不使用 exe 调用

  •  
  •   1462326016 · 2019-10-09 20:47:39 +08:00 · 15022 次点击
    这是一个创建于 1869 天前的主题,其中的信息可能已经有所发展或是发生改变。

    7z.exe 调用的就是 7z.dll ,而且 7z.dll 包含了所有的压缩解压方式。

    一个可行的方案就是通过 shell 的方式调用 7z.exe ,间接去调用 7z.dll 。但是现在有一个大量小文件的压缩解压需求,这种方案的话会频繁的创建进程( 7z.exe )和销毁进程,性能损失太大了,部分文件还需要加密和解密。

    所以想问下有没有人知道怎么调用 7z.dll 直接进行压缩和解压(加密和解密)。

    我知道 7z 是开源的,官方也给了 SDK,但是无奈不会 C++,而且官方给的 SDK 看了半天也没有什么头绪。

    下午的时候搜了搜,找到两个项目也没用上。https://github.com/fancycode/pylzma https://github.com/harvimt/pylib7zip ( 6 年前的项目了,python3.3 )

    因为好多游戏下载网站上都是将游戏数据包压缩存放,然后通过一个 exe 来解压释放的,其中 exe 就调用了 7z.dll ,所以应该不会太难,只是无奈没有文档(我可以看懂的)可以参考。。。

    14 条回复    2020-12-03 10:17:06 +08:00
    verrickt
        1
    verrickt  
       2019-10-09 21:08:36 +08:00 via Android
    一个思路,c#通过 pinvoke 去调 dll
    1462326016
        2
    1462326016  
    OP
       2019-10-09 21:14:59 +08:00
    @verrickt 调用是没有问题的,问题就在于没有一个完整的示例或者文档可以参考,应该传入什么参数,调用哪个函数去要压缩或解压
    est
        3
    est  
       2019-10-09 21:22:16 +08:00
    感觉要构造很多 ctypes 不值得。。
    Laforet
        4
    Laforet  
       2019-10-09 21:29:28 +08:00 via Android
    https://github.com/dsoprea/PyEasyArchive

    参考一下这个项目,其实你说的需求 pylzma 就能做到,没必要头铁去自己调用外部库
    1462326016
        5
    1462326016  
    OP
       2019-10-09 21:36:01 +08:00
    @Laforet 好的,我看下,感谢。之前也考虑了 pylzma,但是后来看 pylzma 文档好像不支持加解密?因为需求中不仅要压缩解压,还有好多需要加密解密的文件。
    1462326016
        6
    1462326016  
    OP
       2019-10-09 21:37:15 +08:00
    @est 没有办法,现在看来只有这样才能避免反复创建进程导致的性能损失。😢
    TtiGeR
        7
    TtiGeR  
       2019-10-09 21:38:45 +08:00 via iPhone
    C#的 Wrapper 一搜就有的嘛

    https://github.com/adoconnection/SevenZipExtractor

    我记得 NuGet 应该也有 7z.Lib 之类的
    1462326016
        8
    1462326016  
    OP
       2019-10-09 21:56:30 +08:00 via Android
    @TtiGeR 😯感谢感谢,我看下。一直在 GitHub 搜 Python 调用方式,忘记搜 c#了。。失误失误。
    est
        9
    est  
       2019-10-09 22:39:14 +08:00
    @1462326016 可以提前把进程 spawn 出来,stdin 给挂起,然后数据来了直接开始解压。

    类似连接池。
    1462326016
        10
    1462326016  
    OP
       2019-10-09 23:04:34 +08:00 via Android
    @est 我没有找到 7z.exe 连续输入输出的方法😥按理说每执行一次应该只能解压一个文件。
    mmdsun
        11
    mmdsun  
       2019-10-10 08:14:42 +08:00 via Android
    c#压缩,解压的库很多。去 NuGet 搜搜看。没必要用 7z 吧
    1462326016
        12
    1462326016  
    OP
       2019-10-10 09:13:01 +08:00
    @mmdsun python 自带有 lzma 的库,但是我需要加解密的功能,所以自带的不满足要求。因为暂时不知道 7z 的加密原理,是先进行压缩再 AES 加密还是说先 AES 加密再压缩,或者是其他的流程。。
    coder001
        13
    coder001  
       2020-12-03 06:19:00 +08:00 via Android
    上古时期的 SevenZipSharp 应该还能再战吧…
    1462326016
        14
    1462326016  
    OP
       2020-12-03 10:17:06 +08:00
    @coder001 应该是可用,只不过是 C#的,不是 python 。😂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3485 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:15 · PVG 19:15 · LAX 03:15 · JFK 06:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.