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

C# 如何使用C重命名.rar.7z、.tar、.zip中的文件和文件夹#,c#,zip,tar,7zip,rar,C#,Zip,Tar,7zip,Rar,我有一个压缩文件.rar.7z、.tar和.zip,我想用C#重命名上面压缩存档的物理文件名 我已经尝试过使用sharpcompress库,但在.rar.7z、.tar和.zip文件中找不到重命名文件或文件夹名的功能 我也尝试过使用DotNetZip库,但它只支持.Zip。请参阅我使用DotNetZip库的尝试 private static void RenameZipEntries(string file) { try {

我有一个压缩文件.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());
            }

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

请帮帮我。

考虑一下7zipsharp:

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

下面是一个使用ModifyArchive方法重命名文件的测试示例,我建议您使用它上学:

这里的代码简化了一点。请注意,测试压缩了一个7z文件以进行测试;这无关紧要,它可能是.txt等。还请注意,它在传递给ModifyArchive的字典中按索引查找文件。有关如何从文件名获取索引的信息,请参阅文档(可能需要循环和比较)

var压缩机=新的sevenzipc压缩机(…snip…);
compressor.CompressFiles(“tmp.7z”,@“Testdata\7z_LZMA2.7z”);
ModifyArchive(“tmp.7z”,新字典{{0,“重命名为.7z”});
使用(var提取器=新的SevenZipExtractor(“tmp.7z”))
{
AreEqual(1,extractor.filescont);
extractor.ExtractArchive(OutputDirectory);
}
Assert.IsTrue(File.Exists(Path.Combine(OutputDirectory,“重命名为.7z”));
Assert.IsFalse(File.Exists(Path.Combine(OutputDirectory,“7z_LZMA2.7z”));

这是一个简单的控制台应用程序,用于重命名.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();
        }
    }
}
使用系统;
使用System.IO;
使用系统IO压缩;
使用System.Linq;
使用系统文本;
名称空间重命名器
{
班级计划
{
静态void Main(字符串[]参数)
{
使用var archive=new ZipArchive(File.Open(@.zip)、FileMode.Open、FileAccess.ReadWrite)、ZipArchiveMode.Update);
var entries=archive.entries.ToArray();
//foreach(条目中的ZipArchiveEntry条目)
//{
////如果ZipArchiveEntry是一个目录,它的全名属性将以“/”结尾(例如“some_dir/”)
////并且其Name属性将为空字符串(“”)。
//如果(!string.IsNullOrEmpty(entry.Name))
//    {
//var newEntry=archive.CreateEntry($“{entry.FullName.Replace(entry.Name,$”{RandomString(10,false)}{Path.GetExtension(entry.Name)}”);
//使用(var a=entry.Open())
//使用(var b=newEntry.Open())
//a.CopyTo(b);
//entry.Delete();
//    }
//}
Parallel.ForEach(条目,条目=>
{
//如果ZipArchiveEntry是一个目录,它的全名属性将以“/”结尾(例如“some_dir/”)
//并且它的Name属性将是空字符串(“”)。
如果(!string.IsNullOrEmpty(entry.Name))
{
ZipArchiveEntry newEntry=archive.CreateEntry($“{entry.FullName.Replace(entry.Name,$”{RandomString(10,false)}{Path.GetExtension(entry.Name)}”);
使用(var a=entry.Open())
使用(var b=newEntry.Open())
a、 抄袭(b);
entry.Delete();
}
});
}
//为文件生成随机名称的步骤
公共静态字符串RandomString(整数大小,布尔小写)
{
StringBuilder=新的StringBuilder();
随机=新随机();
char ch;
对于(int i=0;i
有一个
var result=Path.ChangeExtension(myffile,.jpg”)
->Hi panoskarajohn,我想在问题所列的归档文件中执行此操作,您能建议什么解决方案吗?很抱歉,我没有一个干净的解决方案,我相信您可以在解压缩()后将
重命名为
zip
。是的,我想重命名压缩存档中的文件,而不提取存档,存档格式可以是.rar.7z、.tar或.zip。在大多数格式中,如果不是所有格式,文件名和目录名在生成的二进制文件中都是用可变大小编码的,所以你不能只是“修补”它,你必须重建文件的某些部分。标准库不会这样做。您必须了解每种归档格式,并了解如何做到这一点。艰巨的任务。示例:您好,FastAI,感谢您的回复,但我以前也尝试过这个库,但通常当我们修改存档中的任何文件(无论是内容还是名称)时,存档正在重新压缩,因此如果存档很大,则需要时间重新压缩。由于您的答案中给出了示例代码,因此我认为您首先使用“ExtractArchive”提取了归档文件,然后进行了进一步修改,但这不是一个可靠的解决方案,您能否建议其他任何符合规范的替代方法?所以它也可以提高性能。还有。@NikunjSatasiya-很抱歉回来这么晚。要做到这一点,必须重新编写归档文件。想想必须发生什么。存档文件中有一个包含文件名的目录,以及压缩内容的索引。这不是可以更改长度的“填充”或固定长度条目。也许你会