압축 파일 .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를 원하지만 많은 라이브러리를 시도했지만 여전히 정확한 해결책을 얻지 못했습니다.
도와주세요.
답변
이것은 .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 메소드를 사용하여 파일의 이름을 바꾸는 테스트 샘플입니다. 학교에 갈 것을 제안합니다.
다음은 코드를 약간 단순화 한 것입니다. 테스트는 테스트를 위해 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")));