วิธีการเปลี่ยนชื่อไฟล์และโฟลเดอร์ใน. rar. 7z, .tar, .zip โดยใช้ C #


12

ฉันมีไฟล์บีบอัด. 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 ฉันลองใช้ห้องสมุดหลาย ๆ แห่ง แต่ก็ยังไม่ได้คำตอบที่ถูกต้องเลย

โปรดช่วยฉันด้วย


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

สวัสดี panoskarajohn ฉันต้องการทำสิ่งนี้ในไฟล์ภายในไฟล์เก็บถาวรที่ระบุไว้ในคำถามมีวิธีใดบ้างที่คุณแนะนำ
Nikunj Satasiya

ฉันขอโทษฉันไม่ได้มีวิธีทำความสะอาดสำหรับเรื่องนี้ผมมั่นใจว่าคุณสามารถทำได้the renameหลังจากการแยก () zipในฐานะ
panoskarajohn

1
ใช่ฉันต้องการเปลี่ยนชื่อไฟล์ภายในไฟล์บีบอัดแบบซิปโดยไม่ต้องแยกไฟล์เก็บถาวรและรูปแบบไฟล์เก็บถาวรสามารถเป็นอะไรก็ได้. rar. 7z, .tar หรือ. zip
Nikunj Satasiya

4
ในรูปแบบส่วนใหญ่ถ้าไม่ใช่ทั้งหมดชื่อไฟล์และไดเรกทอรีจะถูกเข้ารหัสด้วยขนาดตัวแปรในไฟล์ไบนารี่ที่ได้ดังนั้นคุณจะไม่สามารถ "แก้ไข" ได้คุณต้องสร้างบางส่วนของไฟล์ขึ้นใหม่ ไลบรารีมาตรฐานไม่ทำเช่นนั้น คุณจะต้องเข้าสู่รูปแบบการเก็บถาวรแต่ละรูปแบบและดูว่าคุณสามารถทำได้อย่างไร งานที่ยากลำบาก ตัวอย่าง: stackoverflow.com/questions/32829839/…
Simon 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();
        }
    }
}

ขอบคุณ Binara สำหรับการตอบกลับของคุณ แต่อย่างที่ฉันเห็นในคำตอบที่มีค่าของคุณคุณพูดถูกเราสามารถเปลี่ยนชื่อไฟล์ในไฟล์ zip ตามที่คุณแสดงในคำตอบของคุณ แต่ถ้าไฟล์ของฉันใหญ่? มันจะเปิดไฟล์ต้นฉบับคัดลอกเนื้อหาทั้งหมดจากนั้นและเขียนเนื้อหาเดียวกัน agin ในไฟล์อื่นและบันทึกไฟล์ใหม่ฉันคิดว่ามันจะใช้เวลานาน คุณมีวิธีแก้ปัญหาอื่นใดอีกไหม?
Nikunj Satasiya

1
ลอง Parallel.ForEach แทนการวนซ้ำแบบวนซ้ำ ฉันได้เปลี่ยนรหัสตาม
Binara Thambugala

ขอบคุณ Binara ฉันจะลองใช้วิธีนี้ในการเปลี่ยนชื่อไฟล์ภายในไฟล์. zip แต่ยังคงมีปัญหาหนึ่งอย่างเมื่อฉันจะแก้ไขไฟล์ภายในไฟล์เก็บถาวรจากนั้นมันจะบีบอัดไฟล์ซิปทั้งหมดของฉันอีกครั้ง
Nikunj Satasiya

3

พิจารณา 7zipsharp:

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

7zip รองรับรูปแบบไฟล์เก็บถาวรมากมาย (ฉันเชื่อว่าทุกอย่างที่คุณพูดถึง) และ 7zipsharp ใช้ 7zip จริง ฉันใช้ 7zipsharp สำหรับไฟล์. 7z เท่านั้น แต่ฉันคิดว่ามันใช้ได้กับคนอื่น

นี่คือตัวอย่างของการทดสอบที่ดูเหมือนจะเปลี่ยนชื่อไฟล์โดยใช้วิธี ModifyArchive ฉันขอแนะนำให้คุณไปที่โรงเรียน:

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

นี่คือรหัสทำให้เข้าใจง่ายขึ้นเล็กน้อย โปรดทราบว่าการทดสอบบีบอัดไฟล์ 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")));

สวัสดี FastAI ขอบคุณสำหรับการตอบกลับของคุณ แต่ฉันได้ลองใช้ไลบรารีนี้มาก่อน แต่โดยทั่วไปเมื่อเราแก้ไขไฟล์ใด ๆ ภายในไฟล์เก็บถาวรไม่ว่าจะเป็นเนื้อหาหรือชื่อไฟล์จะถูกบีบอัดอีกครั้งดังนั้นจึงใช้เวลาในการบีบอัดอีกครั้ง . ตามที่คุณได้รับโค้ดตัวอย่างในคำตอบของคุณฉันคิดว่าคุณได้แยกไฟล์เก็บถาวรก่อนโดยใช้ 'ExtractArchive' และจากนั้นคุณทำการแก้ไขเพิ่มเติม แต่นี่ไม่ใช่วิธีแก้ปัญหาที่เชื่อถือได้คุณช่วยแนะนำแม่มดอื่น ๆ ดังนั้นมันยังสามารถปรับปรุงประสิทธิภาพได้อีกด้วย
Nikunj Satasiya

1
@NikunjSatasiya - ขออภัยที่จะกลับมาช้ามาก ไม่มีวิธีการทำเช่นนี้หากไม่เขียนเก็บถาวรอีกครั้ง คิดเกี่ยวกับสิ่งที่จะต้องเกิดขึ้น มีไดเร็กทอรีในไฟล์เก็บถาวรที่มีชื่อไฟล์และดัชนีไปยังเนื้อหาที่บีบอัด นี่ไม่ใช่รายการความยาว 'เบาะ' / คงที่ซึ่งคุณสามารถเปลี่ยนความยาวได้ บางทีคุณอาจใช้โปรแกรมแก้ไขไบนารี - แต่จากนั้นบ่งบอกถึงไฟล์และข้อมูลที่บีบอัดจาก 'ไดเรกทอรี' จะถูกขัน บางทีคุณสามารถเปลี่ยนชื่อไฟล์แบบนั้นและรักษาความยาวเท่ากันได้ กระบองที่จริงจังไม่ใช่คุณลักษณะที่น่าจะเป็นไปได้
FastAl

1
และพิจารณาว่าไดเร็กทอรีของไฟล์ถูกบีบอัดหรือเข้ารหัส จะไม่มีการเปลี่ยนแปลงจากภายนอก ฉันคิดว่ารูปแบบไฟล์. 7z ได้รับการออกแบบมาตั้งแต่ต้นเพื่อจัดการกับการเปลี่ยนชื่อในสถานที่หรือไม่และสิ่งนี้ทำโดย dev ในโปรเจ็กต์สิ่งนี้อาจเป็นไปได้ แต่เราอยู่ไกลจากนั้น ฉันรู้สึกถึงความเจ็บปวดของคุณ!
FastAl
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.