it-swarm.com.de

ZIP-Ordner in C #

Was ist ein Beispiel (einfacher Code), um einen Ordner in C # zu komprimieren?


Aktualisieren:

Ich sehe keinen Namespace ICSharpCode. Ich habe ICSharpCode.SharpZipLib.dll heruntergeladen, weiß aber nicht, wo die DLL -Datei kopiert werden soll. Was muss ich tun, um diesen Namespace zu sehen?

Und haben Sie einen Link für das MSDN-Beispiel für den Ordner "compress", weil ich zwar alle MSDN-Dateien gelesen habe, aber nichts finden konnte.


OK, aber ich brauche die nächsten Informationen.

Wohin sollte ich ICSharpCode.SharpZipLib.dll kopieren, um diesen Namespace in Visual Studio anzuzeigen?

58
Marko

Diese Antwort ändert sich mit .NET 4.5. Erstellen einer Zip-Datei wird unglaublich einfach . Es werden keine Bibliotheken von Drittanbietern benötigt.

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

ZipFile.CreateFromDirectory(startPath, zipPath);
ZipFile.ExtractToDirectory(zipPath, extractPath);
93
Jarrett Meyer

Aus der DotNetZip -Hilfedatei http://dotnetzip.codeplex.com/releases/

using (ZipFile Zip = new ZipFile())
{
   Zip.UseUnicodeAsNecessary= true;  // utf-8
   Zip.AddDirectory(@"MyDocuments\ProjectX");
   Zip.Comment = "This Zip was created at " + System.DateTime.Now.ToString("G") ; 
   Zip.Save(pathToSaveZipFile);
}
48
Simon

Es gibt nichts in der BCL, das dies für Sie tun kann, aber es gibt zwei große Bibliotheken für .NET, die die Funktionalität unterstützen.

Ich habe beide verwendet und kann sagen, dass die beiden sehr vollständig sind und über gut entwickelte APIs verfügen. Es ist also hauptsächlich eine Frage der persönlichen Vorlieben.

Ich bin nicht sicher, ob sie ausdrücklich das Hinzufügen von Ordnern anstelle von einzelnen Dateien zu Zip-Dateien unterstützen, aber es sollte ziemlich einfach sein, etwas zu erstellen, das rekursiv über ein Verzeichnis und seine Unterverzeichnisse mit DirectoryInfo und FileInfo Klassen.

21
Noldorin

In .NET 4.5 das ZipFile.CreateFromDirectory (startPath, zipPath); Die Methode deckt kein Szenario ab, in dem Sie eine Reihe von Dateien und Unterordnern komprimieren möchten, ohne sie in einem Ordner ablegen zu müssen. Dies gilt, wenn Sie möchten, dass das Entpacken die Dateien direkt im aktuellen Ordner ablegt.

Dieser Code hat für mich funktioniert:

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

Ordner müssen im Zip-Archiv nicht "erstellt" werden. Der zweite Parameter "entryName" in CreateEntryFromFile sollte ein relativer Pfad sein. Beim Entpacken der ZIP-Datei werden die Verzeichnisse der relativen Pfade erkannt und erstellt.

8
Gil Roitto

Im System.IO.Packaging-Namespace gibt es eine ZipPackage-Klasse, die in .NET 3, 3.5 und 4.0 integriert ist.

http://msdn.Microsoft.com/de-de/library/system.io.packaging.zippackage.aspx

Hier ein Beispiel, wie man es benutzt . http://www.codeproject.com/KB/files/ZipUnZipTool.aspx?display=Print

5
dr.

Es gibt einen Artikel über MSDN , der eine Beispielanwendung zum Zippen und Entpacken von Dateien und Ordnern ausschließlich in C # enthält. Ich habe einige der Klassen schon lange erfolgreich damit eingesetzt. Der Code wird unter der Microsoft Permissive License veröffentlicht, wenn Sie diese Art von Informationen benötigen.

EDIT: Danke an Cheeso für den Hinweis, dass ich ein bisschen hinter den Zeiten zurückgeblieben bin. Das MSDN-Beispiel, auf das ich verwiesen habe, verwendet tatsächlich DotNetZip und ist heutzutage wirklich sehr gut ausgestattet. Aufgrund meiner Erfahrung mit einer früheren Version davon würde ich es gerne empfehlen.

SharpZipLib ist auch eine ziemlich ausgereifte Bibliothek und wird von Menschen hoch bewertet und steht unter der GPL-Lizenz. Es hängt wirklich von Ihren Reißverschlussanforderungen ab und davon, wie Sie die Lizenzbedingungen für jeden von ihnen anzeigen.

Reich

4
Xiaofu

mit DotNetZip (als Nuget-Paket verfügbar):

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

Verwendungszweck:

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

Oder

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

Folgender Code verwendet eine Drittanbieter- Zip-Komponente von Rebex :

// 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\*", "");

Oder wenn Sie weitere Ordner hinzufügen möchten, ohne das Archiv mehrmals öffnen und schließen zu müssen:

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

Sie können die Zip-Komponente hier herunterladen .

Die Verwendung einer kostenlosen, von der LGPL lizenzierten SharpZipLib ist eine gängige Alternative.

Haftungsausschluss: Ich arbeite für Rebex

1
Martin Vobr

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

Sie müssen die DLL-Datei als Referenz in Ihrem Projekt hinzufügen. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Verweise -> Referenz hinzufügen -> Durchsuchen, und wählen Sie dann die DLL aus.

Schließlich müssen Sie es als using-Anweisung in den Dateien hinzufügen, in denen Sie es verwenden möchten.

0
AndrewC

ComponentPro Zip kann Ihnen beim Erreichen dieser Aufgabe helfen. Das folgende Code-Snippet komprimiert Dateien und Verzeichnisse in einem Ordner. Sie können auch die Wilcard-Maske verwenden.

using ComponentPro.Compression;
using ComponentPro.IO;

...

// Create a new instance.
Zip zip = new Zip();
// Create a new Zip file.
Zip.Create("test.Zip");

Zip.Add(@"D:\Temp\Abc"); // Add entire D:\Temp\Abc folder to the archive.

// Add all files and subdirectories from 'c:\test' to the archive.
Zip.AddFiles(@"c:\test");
// Add all files and subdirectories from 'c:\my folder' to the archive.
Zip.AddFiles(@"c:\my folder", "");
// Add all files and subdirectories from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2", "22");
// Add all .dat files from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2", "22", "*.dat");
// Or simply use this to add all .dat files from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2\*.dat", "22");
// Add *.dat and *.exe files from 'c:\my folder' to '22' folder within the archive.
Zip.AddFiles(@"c:\my folder2\*.dat;*.exe", "22");

TransferOptions opt = new TransferOptions();
// Donot add empty directories.
opt.CreateEmptyDirectories = false;
Zip.AddFiles(@"c:\abc", "/", opt);

// Close the Zip file.
Zip.Close();

http://www.componentpro.com/doc/Zip enthält weitere Beispiele

0
Alexey Semenyuk