Η συμπίεση / αποσυμπίεση φακέλων και αρχείων

ψήφοι
42

Ξέρει κανείς από ένα καλό τρόπο για τη συμπίεση ή αποσυμπίεση αρχείων και φακέλων σε C # γρήγορα; Χειρισμός μεγάλα αρχεία μπορεί να είναι απαραίτητη.

Δημοσιεύθηκε 01/08/2008 στις 18:13
πηγή χρήστη
Σε άλλες γλώσσες...                            


9 απαντήσεις

ψήφοι
24

Η Καθαρή 2,0 ονομάτων πλαίσιο System.IO.Compressionυποστηρίζει GZip και Deflate αλγορίθμων. Εδώ είναι δύο μέθοδοι που συμπίεση και αποσυμπίεση ένα ρεύμα byte το οποίο μπορείτε να πάρετε από το αντικείμενο το αρχείο σας. Μπορείτε να αντικαταστείστε GZipStreamγια DefaultStreamτις παρακάτω μεθόδους για να χρησιμοποιεί το εν λόγω αλγόριθμο. Αυτό αφήνει ακόμη το πρόβλημα της διακίνησης αρχεία είναι συμπιεσμένα με διαφορετικούς αλγορίθμους όμως.

public static byte[] Compress(byte[] data)
{
    MemoryStream output = new MemoryStream();

    GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
    gzip.Write(data, 0, data.Length);
    gzip.Close();

    return output.ToArray();
}

public static byte[] Decompress(byte[] data)
{
    MemoryStream input = new MemoryStream();
    input.Write(data, 0, data.Length);
    input.Position = 0;

    GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);

    MemoryStream output = new MemoryStream();

    byte[] buff = new byte[64];
    int read = -1;

    read = gzip.Read(buff, 0, buff.Length);

    while (read > 0)
    {
        output.Write(buff, 0, read);
        read = gzip.Read(buff, 0, buff.Length);
    }

    gzip.Close();

    return output.ToArray();
}
Απαντήθηκε 05/08/2008 στις 13:04
πηγή χρήστη

ψήφοι
21

Έχω χρησιμοποιήσει πάντα το SharpZip Βιβλιοθήκη.

Εδώ είναι μια σύνδεση

Απαντήθηκε 01/08/2008 στις 18:30
πηγή χρήστη

ψήφοι
10

Από το .Net 1.1 η μόνη διαθέσιμη μέθοδος που παρεισφρέουν στις βιβλιοθήκες java.
Χρησιμοποιώντας τα Μαθήματα Zip στην J # Βιβλιοθήκες Class για τη συμπίεση αρχείων και δεδομένων με C #
Δεν είμαι σίγουρος αν αυτό έχει αλλάξει τα τελευταία εκδόσεις.

Απαντήθηκε 01/08/2008 στις 18:28
πηγή χρήστη

ψήφοι
8

Η απάντησή μου θα ήταν να κλείσετε τα μάτια σας και να επιλέξουν DotNetZip . Είναι δοκιμαστεί από μια μεγάλη κοινότητα.

Απαντήθηκε 17/11/2013 στις 17:08
πηγή χρήστη

ψήφοι
8

Μπορείτε να χρησιμοποιήσετε μια βιβλιοθήκη 3ου μέρους, όπως SharpZip όπως ο Tom τόνισε.

Ένας άλλος τρόπος (χωρίς να 3ου μέρους) είναι να χρησιμοποιήσετε το API των Windows Shell. Θα πρέπει να ορίσετε μια αναφορά στα στοιχεία ελέγχου Microsoft Shell και η βιβλιοθήκη Αυτοματισμού ΚΟΑ σας C # έργου. Gerald Gibson έχει ένα παράδειγμα στο:

http://geraldgibson.net/dnn/Home/CZipFileCompression/tabid/148/Default.aspx

Αντίγραφο του Internet Archive των νεκρών σελίδας

Απαντήθηκε 01/08/2008 στις 19:04
πηγή χρήστη

ψήφοι
6

GZipStream είναι μια πολύ καλή βοηθητικό πρόγραμμα για να χρησιμοποιήσει.

Απαντήθηκε 13/05/2012 στις 03:01
πηγή χρήστη

ψήφοι
6

Αυτό είναι πολύ εύκολο να γίνει σε Java, και όπως αναφέρθηκε παραπάνω μπορείτε να φτάσετε στις βιβλιοθήκες java.util.zip από C #. Για παραπομπές βλέπε:

java.util.zip javadocs
δείγμα κώδικα

Χρησιμοποίησα αυτό πριν από λίγο καιρό για να κάνει μια βαθιά (αναδρομική) zip της δομής των φακέλων, αλλά δεν νομίζω ότι έχω χρησιμοποιήσει ποτέ την αποσυμπίεση. Αν είμαι τόσο κίνητρα που μπορεί να τραβήξει αυτόν τον κώδικα και να επεξεργαστείτε το σε εδώ αργότερα.

Απαντήθηκε 05/08/2008 στις 00:52
πηγή χρήστη

ψήφοι
5

Μια άλλη καλή εναλλακτική λύση είναι επίσης DotNetZip .

Απαντήθηκε 08/12/2011 στις 23:29
πηγή χρήστη

ψήφοι
0

μπορείτε να δημιουργήσετε αρχείο zip με αυτήν τη μέθοδο:

public async Task<string> CreateZipFile(string sourceDirectoryPath, string name)
    {
        var path = HostingEnvironment.MapPath(TempPath) + name;
        await Task.Run(() =>
        {
            if (File.Exists(path)) File.Delete(path);
            ZipFile.CreateFromDirectory(sourceDirectoryPath, path);
        });
        return path;
    }

και, στη συνέχεια, μπορείτε να αποσυμπιέσετε το αρχείο zip με αυτό μεθόδους:
1- αυτή τη μέθοδο εργασίας με διαδρομή του αρχείου zip

public async Task ExtractZipFile(string filePath, string destinationDirectoryName)
    {
        await Task.Run(() =>
        {
            var archive = ZipFile.Open(filePath, ZipArchiveMode.Read);
            foreach (var entry in archive.Entries)
            {
                entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true);
            }
            archive.Dispose();
        });
    }

2- η μέθοδος αυτή εργασία με ρεύμα αρχείο zip

public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName)
    {
        string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue);
        using (FileStream output = new FileStream(filePath, FileMode.Create))
        {
            await zipFile.CopyToAsync(output);
        }
        await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName));
        await Task.Run(() => File.Delete(filePath));
    }
Απαντήθηκε 09/01/2018 στις 18:35
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more