Gewusst wie: Komprimieren und Extrahieren von Dateien

Der System.IO.Compression-Namespace enthält die folgenden Typen für das Komprimieren und Dekomprimieren von Dateien und Streams. Sie können diese Typen auch verwenden, um den Inhalt einer komprimierten Datei zu lesen und zu ändern:

Die folgenden Beispiele zeigen einige der Aufgaben, die Sie beim Arbeiten, ausführen können mit komprimierten Dateien.

Dieses Beispiel zeigt, wie eine komprimierte Datei erstellt und extrahiert, die eine Dateinamenerweiterung .zip hat, indem die ZipFile-Klasse verwendet. Es komprimiert der Inhalt eines Ordner in eine neue ZIP-Datei und dann Auszüge, die zu einem neuen Ordner entsprechen. Um die ZipFile-Klasse zu verwenden, müssen Sie die Assembly System.IO.Compression.FileSystem im Projekt referenzieren.


using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            string startPath = @"c:\example\start";
            string zipPath = @"c:\example\result.zip";
            string extractPath = @"c:\example\extract";

            ZipFile.CreateFromDirectory(startPath, zipPath);

            ZipFile.ExtractToDirectory(zipPath, extractPath);
        }
    }
}


Das folgende Beispiel zeigt, wie durch den Inhalt einer vorhandenen ZIP-Datei und der Auszugdateien durchläuft, die eine Erweiterung .txt- haben. Es verwendet die ZipArchive-Klasse, um auf eine vorhandene ZIP-Datei zuzugreifen und die ZipArchiveEntry-Klasse, um die einzelnen Einträge in der komprimierten Datei zu überprüfen. Es wird eine Erweiterungsmethode (ExtractToFile) für das ZipArchiveEntry-Objekt. Die Erweiterungsmethode ist in der System.IO.Compression.ZipFileExtensions-Klasse verfügbar. Um die ZipFileExtensions-Klasse zu verwenden, müssen Sie die System.IO.Compression.FileSystem - Assembly im Projekt verweisen.


using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string zipPath = @"c:\example\start.zip";
            string extractPath = @"c:\example\extract";

            using (ZipArchive archive = ZipFile.OpenRead(zipPath))
            {
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    if (entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
                    {
                        entry.ExtractToFile(Path.Combine(extractPath, entry.FullName));
                    }
                }
            } 
        }
    }
}


Im folgenden Beispiel verwendet die ZipArchive-Klasse, um auf eine vorhandene ZIP-Datei zuzugreifen und fügt eine neue Datei der komprimierten Datei hinzu. Die neue Datei ruft komprimiertes ab, wenn Sie die vorhandene ZIP-Datei hinzufügen.


using System;
using System.IO;
using System.IO.Compression;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            using (FileStream zipToOpen = new FileStream(@"c:\users\exampleuser\release.zip", FileMode.Open))
            {
                using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
                {
                    ZipArchiveEntry readmeEntry = archive.CreateEntry("Readme.txt");
                    using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
                    {
                            writer.WriteLine("Information about this package.");
                            writer.WriteLine("========================");
                    }
                }
            }
        }
    }
}


Sie können die GZipStream und DeflateStream-Klassen auch verwenden, um Daten komprimieren und dekomprimieren. Sie verwenden den gleichen Komprimierungsalgorithmus. Komprimierte GZipStream-Objekte, die in eine Datei geschrieben werden, die eine Erweiterung von .gz verfügt, können dekomprimiert werden, indem viele allgemeine Tools sowie zu den Methoden, die von GZipStream bereitgestellt werden. In diesem Beispiel wird veranschaulicht, wie ein Dateiverzeichnis mit der GZipStream-Klasse komprimiert und dekomprimiert wird.


using System;
using System.IO;
using System.IO.Compression;

namespace zip
{
    public class Program
    {
        public static void Main()
        {
            string directoryPath = @"c:\users\public\reports";

            DirectoryInfo directorySelected = new DirectoryInfo(directoryPath);

            foreach (FileInfo fileToCompress in directorySelected.GetFiles())
            {
                Compress(fileToCompress);
            }

            foreach (FileInfo fileToDecompress in directorySelected.GetFiles("*.gz"))
            {
                Decompress(fileToDecompress);
            }
        }

        public static void Compress(FileInfo fileToCompress)
        {
            using (FileStream originalFileStream = fileToCompress.OpenRead())
            {
                if ((File.GetAttributes(fileToCompress.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fileToCompress.Extension != ".gz")
                {
                    using (FileStream compressedFileStream = File.Create(fileToCompress.FullName + ".gz"))
                    {
                        using (GZipStream compressionStream = new GZipStream(compressedFileStream, CompressionMode.Compress))
                        {
                            originalFileStream.CopyTo(compressionStream);
                            Console.WriteLine("Compressed {0} from {1} to {2} bytes.",
                                fileToCompress.Name, fileToCompress.Length.ToString(), compressedFileStream.Length.ToString());
                        }
                    }
                }
            }
        }

        public static void Decompress(FileInfo fileToDecompress)
        {
            using (FileStream originalFileStream = fileToDecompress.OpenRead())
            {
                string currentFileName = fileToDecompress.FullName;
                string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length);

                using (FileStream decompressedFileStream = File.Create(newFileName))
                {
                    using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress))
                    {
                        decompressionStream.CopyTo(decompressedFileStream);
                        Console.WriteLine("Decompressed: {0}", fileToDecompress.Name);
                    }
                }
            }
        }
    }
}


Fanden Sie dies hilfreich?
(1500 verbleibende Zeichen)
Vielen Dank für Ihr Feedback.

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2014 Microsoft