SharpCompress解压带密码的RAR压缩文件问题

项目场景:

因为保密性的原因,我需要针对压缩文件加密,也就是在压缩的同时加上密码;然后代码解压带密码的压缩文件,再去处理解压后的文件。


问题描述

在使用SharpCompress解压带密码的压缩文件时遇到的一系列问题。
例如:
1.解压带密码的rar文件,未解压成功,最后改为zip文件;
2.解压带密码的zip文件,WriteToDirectory时解压过程中会抛异常,后改用WriteToFile;


解决方案:

在使用SharpCompress解压带密码的rar压缩文件是,报file crc mismatch问题;

            using (Stream stream = File.OpenRead(tempPath))
            {
                //压缩文件解密
                var rarPassword = Configuration["RARPassword"];
                var reader = ReaderFactory.Open(stream, new ReaderOptions() { Password = rarPassword });
                while (reader.MoveToNextEntry())
                {
                    if (!reader.Entry.IsDirectory)
                    {
                        Console.WriteLine(reader.Entry.Key);
                        Directory.CreateDirectory(@$"{currentDic}/wwwroot/temp/SQL");
                        reader.WriteEntryToDirectory(@$"{currentDic}/wwwroot/temp/SQL");
                    }
                }
            }

这段代码是把压缩文件的流读取到内存中,再用ReaderFactory去带密解压缩,但在解压缩的时候抛异常,我这里压缩文件里有几十个文件,却只解压了一个文件,所以我想既然可以解压出来一个,说明解密肯定没问题,只不过在解压多个文件的时候抛了异常,内部什么原因就不知道了,只能换个方法。
于是,我按照下面的代码改了下,一个一个输出,发现还是不行。

reader.WriteEntryToFile(Path.Combine(@$"{currentDic}/wwwroot/temp/SQL", reader.Entry.Key));

没办法,我放弃了RAR方式,改用ZIP。

            using (var archive = ArchiveFactory.Open(tempPath, new ReaderOptions { Password = rarPassword }))
            {
                foreach (var entry in archive.Entries)
                {
                    if (!entry.IsDirectory)
                    {
                        Console.WriteLine(entry.Key);
                        Directory.CreateDirectory(@$"{currentDic}/wwwroot/temp/SQL");
                        entry.WriteToDirectory(@$"{currentDic}/wwwroot/temp/SQL");
                    }
                }
            }

用这种方式后,可以把所有的文件解压出来,但每个文件里面都没内容,只是个空文件。
于是 我又尝试单个文件输出,不直接写整个目录了。

entry.WriteEntryToFile(Path.Combine(@$"{currentDic}/wwwroot/temp/SQL", entry.Entry.Key));

最后可以了。

最终可行的解压带密码的zip压缩文件代码:

            using (var archive = ArchiveFactory.Open(tempPath, new ReaderOptions { Password = rarPassword }))
            {
                foreach (var entry in archive.Entries)
                {
                    if (!entry.IsDirectory)
                    {
                        Console.WriteLine(entry.Key);
                        Directory.CreateDirectory(@$"{currentDic}/wwwroot/temp/SQL");
                        entry.WriteToFile(Path.Combine(@$"{currentDic}/wwwroot/temp/SQL", entry.Key));
                    }
                }
            }

总结:

最奇葩的是用这种方式解压带密码的rar文件,都是空文件,zip就没问题,知道的兄弟可以留言下。

posted @ 2022-06-10 14:24  小堂子  阅读(893)  评论(3)    收藏  举报