c# - सी#में ज़िप फ़ोल्डर




zip folder archive compression (9)

DotNetZip का उपयोग कर (nuget पैकेज के रूप में उपलब्ध):

public void Zip(string source, string destination)
{
    using (ZipFile zip = new ZipFile
    {
        CompressionLevel = CompressionLevel.BestCompression
    })
    {
        var files = Directory.GetFiles(source, "*",
            SearchOption.AllDirectories).
            Where(f => Path.GetExtension(f).
                ToLowerInvariant() != ".zip").ToArray();

        foreach (var f in files)
        {
            zip.AddFile(f, GetCleanFolderName(source, f));
        }

        var destinationFilename = destination;

        if (Directory.Exists(destination) && !destination.EndsWith(".zip"))
        {
            destinationFilename += $"\\{new DirectoryInfo(source).Name}-{DateTime.Now:yyyy-MM-dd-HH-mm-ss-ffffff}.zip";
        }

        zip.Save(destinationFilename);
    }
}

private string GetCleanFolderName(string source, string filepath)
{
    if (string.IsNullOrWhiteSpace(filepath))
    {
        return string.Empty;
    }

    var result = filepath.Substring(source.Length);

    if (result.StartsWith("\\"))
    {
        result = result.Substring(1);
    }

    result = result.Substring(0, result.Length - new FileInfo(filepath).Name.Length);

    return result;
}

उपयोग:

Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest");

या

Zip(@"c:\somefolder\subfolder\source", @"c:\somefolder2\subfolder2\dest\output.zip");

C # में फ़ोल्डर को ज़िपित करने का उदाहरण (सरल कोड) क्या है?

अद्यतन करें:

मुझे नेमस्पेस ICSharpCode नहीं दिख रहा है। मैंने ICSharpCode.SharpZipLib.dll डाउनलोड किया लेकिन मुझे नहीं पता कि उस DLL फ़ाइल को कॉपी करने के लिए कहां जाना है। इस नामस्थान को देखने के लिए मुझे क्या करने की ज़रूरत है?

और क्या आपके पास संपीड़ित फ़ोल्डर के लिए उस एमएसडीएन उदाहरण के लिए लिंक है, क्योंकि मैंने सभी एमएसडीएन पढ़ा लेकिन मुझे कुछ भी नहीं मिला।

ठीक है, लेकिन मुझे अगली जानकारी चाहिए।

Visual Studio में नेमस्पेस देखने के लिए मुझे ICSharpCode.SharpZipLib.dll को कॉपी करने के लिए कहां जाना चाहिए?


बीसीएल में आपके लिए ऐसा करने के लिए कुछ भी नहीं है, लेकिन .NET के लिए दो महान पुस्तकालय हैं जो कार्यक्षमता का समर्थन करते हैं।

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

मुझे यकीन नहीं है कि वे फाइलों को ज़िप करने के लिए अलग-अलग फ़ाइलों की बजाय फ़ोल्डरों को जोड़ने का स्पष्ट रूप से समर्थन करते हैं, लेकिन निर्देशिका DirectoryInfo और FileInfo कक्षाओं का उपयोग करके निर्देशिका और इसकी उप-निर्देशिकाओं पर पुनरावर्तित रूप से पुनरावर्तित कुछ ऐसा करना आसान होना चाहिए।


निम्नलिखित कोड रेबेक्स से किसी तृतीय-पक्ष ज़िप घटक का उपयोग करता है:

// add content of the local directory C:\Data\  
// to the root directory in the ZIP archive
// (ZIP archive C:\archive.zip doesn't have to exist) 
Rebex.IO.Compression.ZipArchive.Add(@"C:\archive.zip", @"C:\Data\*", "");

या यदि आप कई बार संग्रह को खोलने और बंद करने की आवश्यकता के बिना अधिक फ़ोल्डरों को जोड़ना चाहते हैं:

using Rebex.IO.Compression;
...

// open the ZIP archive from an existing file 
ZipArchive zip = new ZipArchive(@"C:\archive.zip", ArchiveOpenMode.OpenOrCreate);

// add first folder
zip.Add(@"c:\first\folder\*","\first\folder");

// add second folder
zip.Add(@"c:\second\folder\*","\second\folder");

// close the archive 
zip.Close(ArchiveSaveAction.Auto);

आप यहां ज़िप घटक डाउनलोड कर सकते हैं

एक मुफ्त, एलजीपीएल लाइसेंस प्राप्त SharpZipLib का उपयोग एक आम विकल्प है।

अस्वीकरण: मैं रेबेक्स के लिए काम करता हूं


.NET 4.5 में ZipFile.CreateFromDirectory (स्टार्टपाथ, ज़िपपैथ); विधि उस परिदृश्य को कवर नहीं करती है जहां आप कई फ़ाइलों और उप फ़ोल्डर्स को किसी फ़ोल्डर में रखे बिना ज़िप करना चाहते हैं। यह मान्य है जब आप फ़ाइलों को सीधे मौजूदा फ़ोल्डर में रखने के लिए अनजिप करना चाहते हैं।

यह कोड मेरे लिए काम करता है:

public static class FileExtensions
{
    public static IEnumerable<FileSystemInfo> AllFilesAndFolders(this DirectoryInfo dir)
    {
        foreach (var f in dir.GetFiles())
            yield return f;
        foreach (var d in dir.GetDirectories())
        {
            yield return d;
            foreach (var o in AllFilesAndFolders(d))
                yield return o;
        }
    }
}

void Test()
{
    DirectoryInfo from = new DirectoryInfo(@"C:\Test");
    using (FileStream zipToOpen = new FileStream(@"Test.zip", FileMode.Create))
    {
        using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
        {
            foreach (FileInfo file in from.AllFilesAndFolders().Where(o => o is FileInfo).Cast<FileInfo>())
            {
                var relPath = file.FullName.Substring(from.FullName.Length+1);
                ZipArchiveEntry readmeEntry = archive.CreateEntryFromFile(file.FullName, relPath);
            }
        }
    }
}

फ़ोल्डरों को ज़िप-संग्रह में "निर्मित" होने की आवश्यकता नहीं है। CreateEntryFromFile में दूसरा पैरामीटर "एंट्रीनाम" एक सापेक्ष पथ होना चाहिए, और ज़िप-फ़ाइल को अनपॅक करते समय संबंधित पथों की निर्देशिका का पता लगाया जाएगा और बनाया जाएगा।


"Where should I copy ICSharpCode.SharpZipLib.dll to see that namespace in Visual Studio?"

आपको अपनी परियोजना में संदर्भ के रूप में डीएलएल फ़ाइल जोड़ने की जरूरत है। समाधान एक्सप्लोरर में संदर्भों पर राइट क्लिक करें-> संदर्भ जोड़ें-> ब्राउज़ करें और फिर डीएलएल का चयन करें।

अंत में आपको इसे किसी भी फाइल में उपयोग करने के लिए एक कथन कथन के रूप में जोड़ना होगा।


MSDN पर एक लेख है जिसमें फाइलों और फ़ोल्डरों को पूरी तरह से सी # में ज़िप और अनजिप करने के लिए एक नमूना अनुप्रयोग है। मैं सफलतापूर्वक लंबे समय तक कुछ कक्षाओं का उपयोग कर रहा हूं। कोड को Microsoft Permissive लाइसेंस के तहत जारी किया गया है, अगर आपको उस तरह की चीज़ जाननी है।

संपादित करें: चीसो के लिए धन्यवाद कि यह इंगित करने के लिए कि मैं समय के पीछे थोड़ा सा हूं। एमएसडीएन उदाहरण मैंने इंगित किया है वास्तव में DotNetZip का उपयोग कर रहा है और वास्तव में इन दिनों बहुत ही पूर्ण रूप से प्रदर्शित है। इसके पिछले संस्करण के अपने अनुभव के आधार पर मैं खुशी से इसकी अनुशंसा करता हूं।

SharpZipLib भी एक परिपक्व पुस्तकालय है और लोगों द्वारा अत्यधिक मूल्यांकन किया जाता है, और जीपीएल लाइसेंस के तहत उपलब्ध है। यह वास्तव में आपकी ज़िप आवश्यकताओं पर निर्भर करता है और आप उनमें से प्रत्येक के लिए लाइसेंस शर्तों को कैसे देखते हैं।

धनी



यह उत्तर .NET 4.5 के साथ बदलता है। एक ज़िप फ़ाइल बनाना अविश्वसनीय रूप से आसान हो जाता है । कोई तीसरी पार्टी पुस्तकालयों की आवश्यकता नहीं होगी।

string startPath = @"c:\example\start";
string zipPath = @"c:\example\result.zip";
string extractPath = @"c:\example\extract";

ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);

सबसे महत्वपूर्ण अंतर यह है कि gzip केवल एक फ़ाइल को संपीड़ित करने में सक्षम है जबकि ज़िप एकाधिक फ़ाइलों को एक-एक करके संपीड़ित करता है और बाद में उन्हें एक फ़ाइल में संग्रहीत करता है। इस प्रकार, gzip ज्यादातर समय के साथ आता है (हालांकि अन्य संभावनाएं हैं)। यह कुछ (डी) फायदे के साथ आता है।
यदि आपके पास एक बड़ा संग्रह है और आपको केवल एक फ़ाइल की आवश्यकता है, तो आपको उस फ़ाइल पर जाने के लिए पूरी gzip फ़ाइल को डिकंप्रेस करना होगा। यदि आपके पास ज़िप फ़ाइल है तो यह आवश्यक नहीं है।
दूसरी तरफ, यदि आप 10 समान या यहां तक ​​कि समान फ़ाइलों को संपीड़ित करते हैं, तो ज़िप संग्रह बहुत बड़ा होगा क्योंकि प्रत्येक फ़ाइल को व्यक्तिगत रूप से संपीड़ित किया जाता है, जबकि gzip में टैर के साथ संयोजन में एक फ़ाइल को संपीड़ित किया जाता है जो फाइलें अधिक प्रभावी होती हैं समान (बराबर)।





c# zip folder archive compression