如何使用 C# 重命名 .rar .7z、.tar、.zip 中的文件和文件夹

Nik*_*iya 12 c# zip 7zip rar tar

我有一个压缩文件 .rar .7z、.tar 和 .zip,我想重命名上面使用 C# 存档的压缩文件中可用的物理文件名。

我已经使用一个sharpcompress 库尝试过这个,但是我在.rar .7z、.tar 和.zip 文件中找不到这样的重命名文件或文件夹名称的功能。

我也尝试过使用 DotNetZip 库,但它唯一的支持。 Zip 看看我使用 DotNetZip 库尝试过什么。

private static void RenameZipEntries(string file)
        {
            try
            {
                int renameCount = 0;
                using (ZipFile zip2 = ZipFile.Read(file))
                {

                    foreach (ZipEntry e in zip2.ToList())
                    {
                        if (!e.IsDirectory)
                        {
                            if (e.FileName.EndsWith(".txt"))
                            {
                                var newname = e.FileName.Split('.')[0] + "_new." + e.FileName.Split('.')[1];
                                e.FileName = newname;
                                e.Comment = "renamed";
                                zip2.Save();
                                renameCount++;
                            }
                        }
                    }
                    zip2.Comment = String.Format("This archive has been modified. {0} files have been renamed.", renameCount);
                    zip2.Save();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }

        }
Run Code Online (Sandbox Code Playgroud)

但实际上和上面一样,我也想要 .7z、.rar 和 .tar,我尝试了很多库,但仍然没有得到任何准确的解决方案。

请帮我。

Fas*_*tAl 3

考虑 7zipsharp:

https://www.nuget.org/packages/SevenZipSharp.Net45/

7zip 本身支持很多存档格式(我相信你提到的所有格式),7zipsharp 使用真正的 7zip。我仅将 7zipsharp 用于 .7z 文件,但我敢打赌它也适用于其他文件。

这是一个使用ModifyArchive方法重命名文件的测试示例,我建议你去学校学习一下:

https://github.com/squid-box/SevenZipSharp/blob/f2bee350e997b0f4b1258dff520f36409198f006/SevenZip.Tests/SevenZipCompressorTests.cs

这是稍微简化的代码。请注意,该测试压缩了 7z 文件进行测试;这无关紧要,它可能是 .txt 等。另请注意,它通过传递给 ModifyArchive 的字典中的索引查找文件。请参阅文档以了解如何从文件名获取该索引(也许您必须循环和比较)。

var compressor = new SevenZipCompressor( ... snip ...);

compressor.CompressFiles("tmp.7z", @"Testdata\7z_LZMA2.7z");

compressor.ModifyArchive("tmp.7z", new Dictionary<int, string> { { 0, "renamed.7z" }});

using (var extractor = new SevenZipExtractor("tmp.7z"))
{
    Assert.AreEqual(1, extractor.FilesCount);
    extractor.ExtractArchive(OutputDirectory);
}

Assert.IsTrue(File.Exists(Path.Combine(OutputDirectory, "renamed.7z")));
Assert.IsFalse(File.Exists(Path.Combine(OutputDirectory, "7z_LZMA2.7z")));
Run Code Online (Sandbox Code Playgroud)