C # kullanarak .rar .7z, .tar, .zip dosya ve klasörlerini yeniden adlandırma


12

Sıkıştırılmış bir dosya .rar .7z, .tar ve .zip var ve yukarıdaki sıkıştırılmış arşivlenmiş C # kullanarak fiziksel dosya adını yeniden adlandırmak istiyorum.

Keskin bir kütüphane kullanarak bunu denedim ama .rar .7z, .tar ve .zip dosya içinde dosya veya klasör adını yeniden adlandırmak için böyle bir özellik bulamıyorum.

Ayrıca DotNetZip kütüphanesini kullanmayı denedim ama sadece support.Zip DotNetZip kütüphanesini kullanarak ne denediğimi gördüm.

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());
            }

        }

Ama aslında yukarıdakiyle aynı .7z, .rar ve .tar için de istiyorum, birçok kütüphaneyi denedim ama yine de doğru bir çözüm bulamadım.

Lütfen bana yardım et.


Bir var result = Path.ChangeExtension(myffile, ".jpg");-> docs.microsoft.com/en-us/dotnet/api/…
panoskarajohn

Merhaba panoskarajohn, bu soruya listelenen arşiv içinde dosyada yapmak istiyorum, u önerebilir herhangi bir çözüm var mı?
Nikunj Satasiya

Üzgünüm bunun için temiz bir çözüm yok, eminim the renamesonra Extract () yapabilirsiniz zip.
panoskarajohn

1
Evet, sıkıştırılmış arşivin içindeki dosyaları arşivden çıkarmadan yeniden adlandırmak istiyorum ve arşiv formatı .rar .7z, .tar veya .zip olabilir.
Nikunj Satasiya

4
Çoğu formatta, hepsi olmasa da, dosya ve dizin adları, ortaya çıkan ikili dosyada değişken bir boyutla kodlanır, bu nedenle sadece "yamalayamazsınız", dosyanın bazı bölümlerini yeniden yapılandırmanız gerekir. Standart kütüphaneler bunu yapmaz. Her arşiv biçimine girmeniz ve bunu nasıl yapabileceğinizi görmeniz gerekir. Zor görev. Örnek: stackoverflow.com/questions/32829839/…
Simon Mourier

Yanıtlar:


3

Bu .zip dosyaları yeniden adlandırmak için basit bir konsol uygulaması

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();
        }
    }
}

Teşekkürler Binara, cevabınız için ama değerli cevabınızda görebileceğiniz gibi haklısınız, cevabınızda gösterdiğiniz gibi zip arşivindeki bir dosyayı yeniden adlandırabiliriz, ancak dosyam büyükse? orijinal dosyayı açacak, tüm içeriği kopyalayacak ve aynı içeriği başka bir dosyaya yazacak ve yeni dosyayı kaydedecek, zaman alıcı bir işlem olacağını düşünüyorum. Başka çözümünüz var mı lütfen?
Nikunj Satasiya

1
Sıralı döngü yerine Parallel.ForEach'ı deneyin. Kodu buna göre değiştirdim.
Binara Thambugala

Teşekkür Binara, ben .zip arşivi içindeki dosyayı yeniden adlandırmak için bu çözümü çalışacağız, ama yine de, ne zaman arşiv içindeki herhangi bir dosyayı değiştireceğim gibi o zaman tüm zip yeniden sıkıştırmak olacak yani bunun için herhangi bir çözüm var mı?
Nikunj Satasiya

3

7zipsharp'ı düşünün:

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

7zip'in kendisi birçok arşiv formatını destekliyor (bahsettiğiniz her şeye inanıyorum) ve 7zipsharp gerçek 7zip'i kullanıyor. Sadece .7z dosyaları için 7zipsharp kullandım ama başkaları için işe yarıyor.

ModifyArchive yöntemini kullanarak bir dosyayı yeniden adlandırdığı görünen bir test örneği, okula gitmenizi öneririm:

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

İşte kod biraz basitleştirilmiş. Testin test için bir 7z dosyası sıkıştırdığını unutmayın; Bu önemsiz .txt, vb. olabilir. Ayrıca, dosyayı ModifyArchive'a iletilen sözlükte dizine göre bulduğunu unutmayın. Bu dizini bir dosya adından nasıl alacağınızla ilgili belgelere bakın (belki döngü ve karşılaştırma yapmanız gerekir).

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")));

Merhaba FastAI, Yanıtınız için teşekkürler, ancak daha önce bu kütüphaneyi denedim, ancak genellikle arşivdeki herhangi bir dosyayı içerik veya ad olarak değiştirdiğimizde, arşiv yeniden sıkıştırılıyor, bu nedenle arşiv büyükse yeniden sıkıştırmak için zaman alıyor . Cevabınızda örnek kod verildiğinden, önce 'ExtractArchive' kullanarak arşivi çıkardığınızı ve daha sonra başka bir değişiklik yaptığınızı düşünüyorum, ancak bu güvenilir bir çözüm değil, lütfen başka bir alternatif yol önerebilir misiniz cadı kanonik mi? böylece aynı zamanda performansı artırabilir.
Nikunj Satasiya

1
@NikunjSatasiya - Bu kadar geç döndüğüm için üzgünüm. Arşivi yeniden yazmadan bunu yapmanın bir yolu yok. Ne olması gerektiğini düşünün. Arşiv dosyasında dosya adlarını içeren bir dizin ve sıkıştırılmış içeriğe ilişkin bir dizin vardır. Bu, uzunluğu değiştirebileceğiniz 'dolgulu' / sabit uzunluklu bir giriş değildir. Belki bir ikili editör ile yapabilirsiniz - ancak daha sonra dosya ve 'dizin' sıkıştırılmış verileri gösterir vidalı olurdu. Belki de dosya adını bu şekilde değiştirebilir ve aynı uzunlukta tutabilirsiniz. Ciddi çamur, muhtemelen bir özellik değil.
FastAl

1
Ve sonra dosya dizininin sıkıştırılmış veya şifrelenmiş olduğunu düşünün. Dışarıdan değişiklik yapılamaz. .7z dosya formatının yerinde yeniden adlandırmaları işlemek için baştan tasarlanıp tasarlanmadığını ve projedeki bir geliştirici tarafından yapıldığını varsayalım, bu mümkün olabilir, ancak bundan aşağı doğru uzun bir yoluz. Acını hissediyorum!
FastAl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.