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



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

我已经使用锐压缩库尝试过这个,但我找不到这样的功能来重命名文件或文件夹名称.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());
}
}

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

请帮助我。

这是一个简单的控制台应用程序,用于重命名.zip中的文件

using System;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text;
namespace Renamer
{
class Program
{
static void Main(string[] args)
{
using var archive = new ZipArchive(File.Open(@"<Your File>.zip", FileMode.Open, FileAccess.ReadWrite), ZipArchiveMode.Update);
var entries = archive.Entries.ToArray();
//foreach (ZipArchiveEntry entry in entries)
//{
//    //If ZipArchiveEntry is a directory it will have its FullName property ending with "/" (e.g. "some_dir/") 
//    //and its Name property will be empty string ("").
//    if (!string.IsNullOrEmpty(entry.Name))
//    {
//        var newEntry = archive.CreateEntry($"{entry.FullName.Replace(entry.Name, $"{RandomString(10, false)}{Path.GetExtension(entry.Name)}")}");
//        using (var a = entry.Open())
//        using (var b = newEntry.Open())
//            a.CopyTo(b);
//        entry.Delete();
//    }
//}
Parallel.ForEach(entries, entry =>
{
//If ZipArchiveEntry is a directory it will have its FullName property ending with "/" (e.g. "some_dir/") 
//and its Name property will be empty string ("").
if (!string.IsNullOrEmpty(entry.Name))
{
ZipArchiveEntry newEntry = archive.CreateEntry($"{entry.FullName.Replace(entry.Name, $"{RandomString(10, false)}{Path.GetExtension(entry.Name)}")}");
using (var a = entry.Open())
using (var b = newEntry.Open())
a.CopyTo(b);
entry.Delete();
}
});
}
//To Generate random name for the file
public static string RandomString(int size, bool lowerCase)
{
StringBuilder builder = new StringBuilder();
Random random = new Random();
char ch;
for (int i = 0; i < size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
builder.Append(ch);
}
if (lowerCase)
return builder.ToString().ToLower();
return builder.ToString();
}
}
}

考虑 7zipsharp:

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

7zip本身支持许多存档格式(我相信你提到的所有格式(,而7zipsharp使用真正的7zip。我只对.7z文件使用了 7zipsharp,但我敢打赌它适用于其他人。

这是一个测试示例,它似乎使用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", @"Testdata7z_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")));

最新更新