.Rz .7z, .tar, .zip এ সি # ব্যবহার করে কীভাবে ফাইল এবং ফোল্ডারটির নাম পরিবর্তন করবেন


12

আমার কাছে একটি সংকুচিত ফাইল রয়েছে .rar .7z, .tar এবং .zip এবং আমি সি # ব্যবহার করে উপরের সংক্ষেপিত সংরক্ষণাগারে উপলব্ধ শারীরিক ফাইলটির নাম পরিবর্তন করতে চাই।

আমি এটি একটি শার্প কমপ্রেস লাইব্রেরি ব্যবহার করে চেষ্টা করেছি তবে .rar .7z, .tar এবং .zip ফাইলের মধ্যে ফাইল বা ফোল্ডারের নাম পুনর্নবীকরণের জন্য এমন বৈশিষ্ট্যটি আমি খুঁজে পাচ্ছি না।

আমি ডটনেটজিপ লাইব্রেরিটি ব্যবহার করার চেষ্টা করেছি তবে এটির একমাত্র সমর্থন Z জিপটি আমি ডটনেটজিপ লাইব্রেরিটি ব্যবহার করে কী চেষ্টা করেছি তা দেখুন।

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

        }

তবে প্রকৃতপক্ষে একইভাবে আমি .7 জেড, .আরআর এবং। ডারের জন্যও চাই, অনেকগুলি লাইব্রেরি চেষ্টা করেছি তবুও আমি কোনও সঠিক সমাধান পাইনি।

আমাকে সাহায্য করুন.


একটি var result = Path.ChangeExtension(myffile, ".jpg");-> ডকস.মাইক্রোসফট.
en-

হাই প্যানোসকারজোহান, আমি প্রশ্নটিতে তালিকাভুক্ত আর্কাইভের মধ্যে ফাইলটিতে এটি করতে চাই, আপনি কি কোনও সমাধানের পরামর্শ দিতে পারেন?
নিকুঞ্জ সাতাসিয়া

আমি দুঃখিত আমি এর জন্য একটি পরিষ্কার সমাধান নেই, আমি নিশ্চিত আপনি the renameএক্সট্র্যাক্ট () এর পরেও এটি করতে পারেন zip
পানোসকারজোহন

1
হ্যাঁ, আমি সংরক্ষণাগারটি আর্কাইভ ছাড়াই জিপ করা সংরক্ষণাগারের ভিতরে থাকা ফাইলগুলির নাম পরিবর্তন করতে চাই এবং সংরক্ষণাগার ফর্মেট .R .7z, .tar বা .zip যে কোনও কিছু হতে পারে।
নিকুঞ্জ সাতাসিয়া

4
বেশিরভাগ ফর্ম্যাটে, ফাইল না থাকলে ফাইল এবং ডিরেক্টরিগুলির নামগুলি ফলস্বরূপ বাইনারি ফাইলটিতে পরিবর্তনশীল আকারের সাথে এনকোড থাকে, সুতরাং আপনি কেবল এটি "প্যাচ" করতে পারবেন না, আপনাকে ফাইলের কিছু অংশ পুনর্গঠন করতে হবে। স্ট্যান্ডার্ড গ্রন্থাগারগুলি এটি করে না। আপনাকে প্রতিটি সংরক্ষণাগার বিন্যাসে যেতে হবে এবং এটি কীভাবে করতে পারে তা দেখতে হবে। কঠিন কাজ. উদাহরণ: stackoverflow.com/questions/32829839/...
সাইমন Mourier

উত্তর:


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
সিক্যুয়াল লুপের পরিবর্তে সমান্তরাল.ফরএচ চেষ্টা করুন। আমি সেই অনুযায়ী কোড পরিবর্তন করেছি।
বিনারা থম্বুগালা

ধন্যবাদ বিনারা, আমি .zip আর্কাইভের মধ্যে ফাইলটির নাম পরিবর্তন করার জন্য এই সমাধানটি চেষ্টা করব, তবে এখনও, এখানে একটি সমস্যা রয়েছে যখন আমি সংরক্ষণাগারটির মধ্যে কোনও ফাইল সংশোধন করব তখন এটি আমার পুরো জিপটি পুনরায় সংকোচিত করবে তাই এর কোনও সমাধান আছে কি?
নিকুঞ্জ সাতসিয়া

3

7zipharp বিবেচনা করুন:

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

7zip নিজেই প্রচুর সংরক্ষণাগার ফর্ম্যাটকে সমর্থন করে (আমি বিশ্বাস করি আপনি সমস্ত উল্লেখ করেছেন) এবং 7zipharp আসল 7zip ব্যবহার করে। আমি শুধুমাত্র .7z ফাইলগুলির জন্য 7zipharp ব্যবহার করেছি তবে আমি বাজি ধরে রাখি এটি অন্যের পক্ষে কাজ করে।

এখানে এমন একটি পরীক্ষার নমুনা যা ModifyArchive পদ্ধতি ব্যবহার করে কোনও ফাইলের নাম পরিবর্তন করতে দেখা যায়, আমি আপনাকে এটিতে স্কুলে যাওয়ার পরামর্শ দিই:

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

এখানে কোডটি কিছুটা সরল করা হয়েছে। নোট করুন যে পরীক্ষাটি তার পরীক্ষার জন্য একটি 7z ফাইলকে সংকুচিত করে; এটি অবিচল, এটি। টেক্সট ইত্যাদি হতে পারে Also এছাড়াও নোট করুন যে এটি অভিধানে সূচি অনুসারে ফাইলটি মডিফাইআর্কাইভকে পাস করেছে finds কোনও ফাইলনাম থেকে কীভাবে সেই সূচি পেতে হয় তার জন্য ডকুমেন্টেশনের পরামর্শ নিন (সম্ভবত আপনাকে লুপ এবং তুলনা করতে হবে)।

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

হাই ফাস্টাএই, আপনার প্রতিক্রিয়াটির জন্য ধন্যবাদ তবে আমি এই লাইব্রেরিটির আগেও চেষ্টা করেছি কিন্তু সাধারণত যখন আমরা সংরক্ষণাগারের অভ্যন্তরে কোনও ফাইলই এর বিষয়বস্তু বা নাম পরিবর্তন করি তখন সংরক্ষণাগারটি পুনরায় সংক্ষেপণ করে তাই আর্কাইভ বড় হলে পুনরায় সংক্ষেপণের জন্য সময় নেয় । আপনার উত্তরে যেমন আপনাকে নমুনা কোড দেওয়া হয়ে থাকে তখন আমি মনে করি আপনি প্রথমে 'এক্সট্রাক্ট আর্কাইভ' ব্যবহার করে সংরক্ষণাগারটি বের করেছেন এবং তারপরে আপনি আরও সংশোধন করেন তবে এটি কোনও নির্ভরযোগ্য সমাধান নয়, আপনি দয়া করে অন্য কোনও বিকল্প উপায় ডাইনিকে ন্যায্য বলে পরামর্শ দিতে পারেন? সুতরাং এটি পারফরম্যান্সকেও উন্নত করতে পারে al
নিকুঞ্জ সাতসিয়া

1
@ নিকুঞ্জসটাসিয়া - দুঃখিত, এত দেরীতে ফিরে এসেছি। সংরক্ষণাগারটি পুনরায় না লিখে এটি করার কোনও উপায় নেই। কী ঘটবে তা ভেবে দেখুন। সংরক্ষণাগার ফাইলে ফাইলের নাম সহ একটি ডিরেক্টরি রয়েছে এবং সংকোচিত সামগ্রীতে একটি সূচক রয়েছে। এটি কোনও 'প্যাডড' / নির্দিষ্ট দৈর্ঘ্যের এন্ট্রি নয় যেখানে আপনি দৈর্ঘ্য পরিবর্তন করতে পারবেন। সম্ভবত আপনি একটি বাইনারি সম্পাদক সহ করতে পারেন - তবে তারপরে ফাইলগুলি এবং 'ডিরেক্টরি' থেকে তাদের সংকোচিত ডেটা সূচিত হবে। হতে পারে আপনি সেই মতো ফাইলের নাম পরিবর্তন করতে এবং একই দৈর্ঘ্য রাখতে পারেন। গুরুতর কুঁচকে, সম্ভবত কোনও বৈশিষ্ট্য নয়।
ফাস্টআল

1
এবং তারপরে বিবেচনা করুন যদি ফাইলগুলির ডিরেক্টরি সংকুচিত বা এনক্রিপ্ট করা হয়। বাইরে থেকে কোনও পরিবর্তন সম্ভব হবে না। আমি মনে করি যদি .7z ফাইল ফর্ম্যাটটি স্থান থেকে পুনরায় নামগুলি হ্যান্ডেল করার জন্য শুরু থেকেই ডিজাইন করা হয়েছিল, এবং এটি প্রকল্পের কোনও দেব দ্বারা করা হয়েছিল, তবে এটি সম্ভব হতে পারে তবে আমরা সেখান থেকে অনেক দূরে স্রোত। আমি তোমার কষ্টটা অনুভব করতে পারছি!
ফাস্টআল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.