C# 如何使用C重命名.rar.7z、.tar、.zip中的文件和文件夹#
我有一个压缩文件.rar.7z、.tar和.zip,我想用C#重命名上面压缩存档的物理文件名 我已经尝试过使用sharpcompress库,但在.rar.7z、.tar和.zip文件中找不到重命名文件或文件夹名的功能 我也尝试过使用DotNetZip库,但它只支持.Zip。请参阅我使用DotNetZip库的尝试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 {
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-很抱歉回来这么晚。要做到这一点,必须重新编写归档文件。想想必须发生什么。存档文件中有一个包含文件名的目录,以及压缩内容的索引。这不是可以更改长度的“填充”或固定长度条目。也许你会