.Rar .7z, .tar, .zip में C # का उपयोग करके फ़ाइलों और फ़ोल्डर का नाम कैसे बदलें


12

मेरे पास एक संपीड़ित फ़ाइल .rar .7z, .tar और .zip है और मैं C # का उपयोग करके संग्रहीत संपीड़ित में ऊपर उपलब्ध भौतिक फ़ाइल नाम का नाम बदलना चाहता हूं।

मैंने एक शार्पकॉम लाइब्रेरी का उपयोग करके यह कोशिश की है, लेकिन मुझे .rar .7z, .tar और .zip फ़ाइल के अंदर फ़ाइल नाम या फ़ोल्डर नाम के लिए ऐसी सुविधा नहीं मिल रही है।

मैंने DotNetZip लाइब्रेरी का उपयोग करने की भी कोशिश की है, लेकिन इसका एकमात्र समर्थन है। देखें कि मैंने 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 के लिए, मैंने कई पुस्तकालयों की कोशिश की लेकिन फिर भी मुझे कोई सटीक समाधान नहीं मिला।

क्रिप्या मेरि सहायता करे।


वहां एक है var result = Path.ChangeExtension(myffile, ".jpg"); -> docs.microsoft.com/en-us/dotnet/api/…
panoskarajohn

हाय panoskarajohn, मैं इस सवाल पर सूचीबद्ध संग्रह के भीतर फ़ाइल पर करना चाहते हैं, क्या कोई समाधान यू सुझाव दे सकता है?
निकुंज सतसिया

मुझे खेद है कि मेरे पास इसके लिए एक साफ समाधान नहीं है, मुझे यकीन है कि आप कर सकते हैं the rename एक्सट्रैक्ट () के बादzip
पनसोकरजोहोन

1
हां, मैं संग्रहित एक्सट्रैक्ट के बिना ज़िप किए गए संग्रह के अंदर फ़ाइलों का नाम बदलना चाहता हूं और संग्रह में कुछ भी हो सकता है ।rar .7z, .tar या .zip
निकुंज सतसिया

4
अधिकांश प्रारूपों में, यदि सभी नहीं, फ़ाइल और निर्देशिका नाम परिणामित बाइनरी फ़ाइल में एक चर आकार के साथ एन्कोडेड हैं, तो आप इसे केवल "पैच" नहीं कर सकते, आपको फ़ाइल के कुछ हिस्सों को फिर से बनाना होगा। मानक पुस्तकालय ऐसा नहीं करते हैं। आपको प्रत्येक संग्रह प्रारूप में जाना होगा और देखना होगा कि आप इसे कैसे कर सकते हैं। मुश्किल कार्य। उदाहरण: stackoverflow.com/questions/32829839/…
साइमन मॉरियर

जवाबों:


3

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

धन्यवाद, बिनारा, आपकी प्रतिक्रिया के लिए, लेकिन जैसा कि मैं आपके बहुमूल्य उत्तर में देख सकता हूं कि आप सही हैं हम आपके संग्रह में एक फ़ाइल का नाम बदल सकते हैं जैसा कि आपने अपने उत्तर में दिखाया था, लेकिन अगर मेरी फ़ाइल बड़ी है तो? यह मूल फ़ाइल को खोलेगा, उसमें से पूरी सामग्री को कॉपी करेगा और उसी सामग्री को दूसरी फ़ाइल में लिखेगा और नई फ़ाइल को बचाएगा, मुझे लगता है कि यह एक समय लेने वाली प्रक्रिया होगी। क्या आपके पास कोई और उपाय है?
निकुंज सतसिया

1
अनुक्रमिक लूप के बजाय Parallel.ForEach का प्रयास करें। मैंने तदनुसार कोड बदल दिया है।
बिनारा थमबगला

धन्यवाद बिनारा, मैं .zip संग्रह में फ़ाइल का नाम बदलने के लिए इस समाधान का प्रयास करूंगा, लेकिन फिर भी, एक समस्या है जब मैं संग्रह के भीतर किसी भी फ़ाइल को संशोधित करूंगा तो यह मेरे पूरे ज़िप को पुन: संपीड़ित करेगा इसलिए क्या इसका कोई समाधान है?
निकुंज सतसैया

3

7zipsharp पर विचार करें:

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

7zip अपने आप में बहुत सारे आर्काइव फॉर्मेट का समर्थन करता है (मेरा मानना ​​है कि आप सभी का उल्लेख है) और 7zipsharp असली 7zip का उपयोग करता है। मैंने .z फ़ाइलों के लिए केवल 7zipsharp का उपयोग किया है, लेकिन मुझे यकीन है कि यह दूसरों के लिए काम करता है।

यहाँ एक परीक्षण का एक नमूना है जो संशोधित विधि का उपयोग करके एक फ़ाइल का नाम बदलने के लिए प्रकट होता है, मेरा सुझाव है कि आप इसमें स्कूल जाते हैं:

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

यहाँ कोड को थोड़ा सरल किया गया है। ध्यान दें कि परीक्षण अपने परीक्षण के लिए 7z फ़ाइल को संपीड़ित करता है; यह सारहीन हो सकता है कि यह .txt इत्यादि हो, यह भी नोट करें कि यह RevArchive को दिए गए शब्दकोष में इंडेक्स द्वारा फाइल ढूंढता है। एक फ़ाइल नाम से उस सूचकांक को प्राप्त करने के लिए प्रलेखन से परामर्श करें (शायद आपको लूप करना और तुलना करना है)।

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

हाय FastAI, आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन मैंने पहले भी इस पुस्तकालय की कोशिश की है, लेकिन आम तौर पर जब हम संग्रह के अंदर किसी भी फ़ाइल को संशोधित करते हैं या तो यह सामग्री या नाम होता है, तो संग्रह फिर से संपीड़ित हो रहा है, यदि संग्रह बड़ा है, तो इसे पुन: संपीड़ित करने के लिए समय ले रहा है । जैसा कि आपको अपने उत्तर में नमूना कोड दिया गया है, तो मुझे लगता है कि आपने 'ExtractArchive' का उपयोग करके पहले संग्रह निकाला है और फिर आप आगे संशोधन करते हैं, लेकिन यह एक विश्वसनीय समाधान नहीं है, क्या आप कृपया सुझाव दे सकते हैं कि कोई अन्य वैकल्पिक तरीका है विहित? इसलिए यह प्रदर्शन में सुधार भी कर सकता है।
निकुंज सतसिया

1
@NikunjSatasiya - इतनी देर से वापस आने के लिए क्षमा करें। संग्रह को फिर से लिखने के बिना ऐसा करने का कोई तरीका नहीं है। सोचिए क्या होना चाहिए। फ़ाइल नाम के साथ संग्रह फ़ाइल में एक निर्देशिका है, और संपीड़ित सामग्री के लिए एक सूचकांक है। यह एक 'गद्देदार' / निश्चित लंबाई प्रविष्टि नहीं है जहाँ आप लंबाई बदल सकते हैं। शायद आप एक द्विआधारी संपादक के साथ हो सकते हैं - लेकिन फिर फाइलों के संकेत और 'निर्देशिका' से उनके संकुचित डेटा को खराब कर दिया जाएगा। हो सकता है कि आप उस तरह फ़ाइल नाम बदल सकते हैं और समान लंबाई रख सकते हैं। गंभीर कीचड़, एक सुविधा की संभावना नहीं।
उपवास

1
और फिर विचार करें कि क्या फ़ाइलों की निर्देशिका संकुचित या एन्क्रिप्ट की गई है। बाहर से कोई बदलाव संभव नहीं होगा। मुझे लगता है कि अगर .7z फ़ाइल प्रारूप को शुरुआत में जगह के नाम को संभालने के लिए डिज़ाइन किया गया था, और यह प्रोजेक्ट पर एक देव द्वारा किया गया था, तो यह संभव हो सकता है, लेकिन हम उससे एक लंबी दूरी की धारा हैं। मै तुम्हारा दर्द समझ सकता हू!
FastAl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.