it-swarm.com.de

Einzelne Datei mit C # komprimieren

Ich verwende .NET 4.5, und die ZipFile-Klasse funktioniert hervorragend, wenn ich versuche, ein gesamtes Verzeichnis mit "CreateFromDirectory" zu komprimieren. Ich möchte jedoch nur eine Datei im Verzeichnis komprimieren. Ich habe versucht, auf eine bestimmte Datei (Ordner\data.txt) zu zeigen, aber das funktioniert nicht. Ich habe die ZipArchive-Klasse in Betracht gezogen, da sie über eine "CreateEntryFromFile" -Methode verfügt, aber anscheinend können Sie damit nur einen Eintrag in eine vorhandene Datei erstellen. 

Gibt es keine Möglichkeit, einfach eine Datei zu komprimieren, ohne eine leere ZIP-Datei zu erstellen (deren Probleme auftreten) und dann die ZipArchiveExtension-Methode "CreateEntryFromFile" zu verwenden?

** Dies setzt auch voraus, dass ich an einem Unternehmensprogramm arbeite, das derzeit keine Add-Ons von Drittanbietern verwenden kann.

beispiel aus: http://msdn.Microsoft.com/de-de/library/ms404280%28v=vs.110%29.aspx

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

        ZipFile.CreateFromDirectory(startPath, zipPath);

        ZipFile.ExtractToDirectory(zipPath, extractPath);

Wenn startPath @"c:\example\start\myFile.txt;" wäre, würde ein Fehler ausgegeben, dass das Verzeichnis ungültig ist.

26
user3362735

Die einfachste Möglichkeit, dies zu erreichen, ist die Verwendung eines temporären Ordners.

FÜR VERSCHIFFEN:

  1. Erstellen Sie einen temporären Ordner
  2. Datei in Ordner verschieben
  3. Zip Ordner
  4. Lösche Ordner

FÜR UNZIPPING:

  1. Archiv entpacken
  2. Verschieben Sie die Datei aus dem temporären Ordner an Ihren Speicherort
  3. Löschen Sie den temporären Ordner
5
AlexanderBrevig

Verwenden Sie CreateEntryFromFile aus einem Archiv und verwenden Sie eine Datei oder einen Speicherstrom:

Verwenden Sie einen Filestream, wenn Sie die Zip-Datei erstellen und anschließend hinzufügen möchten:

using (FileStream fs = new FileStream(@"C:\Temp\output.Zip",FileMode.Create))
using (ZipArchive Arch = new ZipArchive(fs, ZipArchiveMode.Create))
{
    Arch.CreateEntryFromFile(@"C:\Temp\data.xml", "data.xml");
}

Oder wenn Sie alles im Speicher erledigen und die Datei schreiben müssen, verwenden Sie einen Speicher-Stream:

using (MemoryStream ms = new MemoryStream())
using (ZipArchive Arch = new ZipArchive(ms, ZipArchiveMode.Create))
{
    Arch.CreateEntryFromFile(@"C:\Temp\data.xml", "data.xml");
}

Dann können Sie den MemoryStream in eine Datei schreiben .

using (FileStream file = new FileStream("file.bin", FileMode.Create, System.IO.FileAccess.Write)) {
   byte[] bytes = new byte[ms.Length];
   ms.Read(bytes, 0, (int)ms.Length);
   file.Write(bytes, 0, bytes.Length);
   ms.Close();
}
36
John Koerner

Datei (oder einen beliebigen Stream) verwenden:

using (var Zip = ZipFile.Open("file.Zip", ZipArchiveMode.Create))
{
    var entry = Zip.CreateEntry("file.txt");
    entry.LastWriteTime = DateTimeOffset.Now;

    using (var stream= File.OpenRead(@"c:\path\to\file.txt"))
    using (var entryStream = entry.Open())
        stream.CopyTo(entryStream);
}

oder kürzer:

// reference System.IO.Compression
using (var Zip = ZipFile.Open("file.Zip", ZipArchiveMode.Create))
    Zip.CreateEntryFromFile("file.txt", "file.txt");

stellen Sie sicher, dass Sie Verweise auf System.IO.Compression hinzufügen

Update

Lesen Sie auch die neue Dotnet-API-Dokumentation für ZipFile und ZipArchive . Hier gibt es einige Beispiele. Es gibt auch eine Warnung zum Verweisen auf System.IO.Compression.FileSystem zur Verwendung von ZipFile.

Um die ZipFile-Klasse verwenden zu können, müssen Sie auf .__ verweisen. System.IO.Compression.FileSystem Assembly in Ihrem Projekt.

20
ziya

verwenden Sie einfach folgenden Code zum Komprimieren einer Datei.

public void Compressfile()
        {
             string fileName = "Text.txt";
             string sourcePath = @"C:\SMSDBBACKUP";
             DirectoryInfo di = new DirectoryInfo(sourcePath);
             foreach (FileInfo fi in di.GetFiles())
             {
                 //for specific file 
                 if (fi.ToString() == fileName)
                 {
                     Compress(fi);
                 }
             } 
        }

public static void Compress(FileInfo fi)
        {
            // Get the stream of the source file.
            using (FileStream inFile = fi.OpenRead())
            {
                // Prevent compressing hidden and 
                // already compressed files.
                if ((File.GetAttributes(fi.FullName)
                    & FileAttributes.Hidden)
                    != FileAttributes.Hidden & fi.Extension != ".gz")
                {
                    // Create the compressed file.
                    using (FileStream outFile =
                                File.Create(fi.FullName + ".gz"))
                    {
                        using (GZipStream Compress =
                            new GZipStream(outFile,
                            CompressionMode.Compress))
                        {
                            // Copy the source file into 
                            // the compression stream.
                            inFile.CopyTo(Compress);

                            Console.WriteLine("Compressed {0} from {1} to {2} bytes.",
                                fi.Name, fi.Length.ToString(), outFile.Length.ToString());
                        }
                    }
                }
            }
        }

    }
0
Jeetendra Negi

In .NET gibt es mehrere Möglichkeiten, das Problem für eine einzelne Datei zu lösen. Wenn Sie nicht alles lernen wollen, können Sie eine abstrahierte Bibliothek wie SharpZipLib (alte Open-Source-Bibliothek), Sevenzipsharp (erfordert 7Zip-Bibliotheken darunter) oder DotNetZip.

0