Quel est le meilleur moyen de bloquer les fichiers à l'aide de C #? Idéalement, je veux être capable de séparer des fichiers dans une seule archive. P>
6 Réponses :
Avez-vous regardé SharpziPlib ? P>
Je crois que vous peut em> construire des fichiers zip avec des classes dans system.io.packaging code>
espace de noms - mais chaque fois que j'ai essayé de m'y regarder, je l'ai trouvé plutôt déroutant ... P >
Jetez un coup d'œil à cette bibliothèque: http://www.icshaarpcode.net/opensource/sharpziplib/
Il est Pretty global, il traite avec de nombreux formats, est open-source et vous pouvez utiliser dans des applications commerciales à source fermée. P>
Il est très simple à utiliser: P>
byte[] data1 = new byte[...]; byte[] data2 = new byte[...]; /*...*/ var path = @"c:\test.zip"; var zip = new ZipOutputStream(new FileStream(path, FileMode.Create)) { IsStreamOwner = true } zip.PutNextEntry("File1.txt"); zip.Write(data1, 0, data1.Length); zip.PutNextEntry("File2.txt"); zip.Write(data2, 0, data2.Length); zip.Close(); zip.Dispose();
Vous pouvez utiliser DotNetZip pour archiommez ceci. C'est libre d'utiliser dans n'importe quelle application.
Quelques exemple de code: p>
PS: Je viens d'ajouter un déflate multi-fileté à DotNetZip. Parce que déflate est à forte intensité de calcul, l'utilisation de plusieurs threads le rend considérablement plus rapide sur des fichiers volumineux, lors de l'exécution de machines multi-noyau. Dans mes mesures, il peut couper 45% du temps de ziper une grande archive, par rapport à DotNetZip sans le support multi-thread. Et le modèle de programmation n'est pas différent - c'est le même code à l'extérieur. Ce ne sont que les internes qui ont changé. Vous avez besoin de v1.9.0.29 pour obtenir ce speedUp.
Il y a quelques bibliothèques autour - le plus populaire de laquelle sont DotNetZip et sharpziplib . P>
HI j'ai créé deux méthodes avec la bibliothèque de Shaplib (vous pouvez le télécharger ici http: // www. ICSHARPCODE.NET/OPENSOURCE/SHARPZIPLIB/ ) qui souhaite partager, ils sont très faciles à utiliser simplement passer une source et un chemin cible (FullPath comprenant le dossier / le fichier et l'extension). J'espère que cela vous aide!
//ALLYOURNAMESPACESHERE using ... //SHARPLIB using ICSharpCode.SharpZipLib.Zip; using ICSharpCode.SharpZipLib.Zip.Compression.Streams; public static class FileUtils { /// <summary> /// /// </summary> /// <param name="sourcePath"></param> /// <param name="targetPath"></param> public static void ZipFile(string sourcePath, string targetPath) { string tempZipFilePath = targetPath; using (FileStream tempFileStream = File.Create(tempZipFilePath, 1024)) { using (ZipOutputStream zipOutput = new ZipOutputStream(tempFileStream)) { // Zip with highest compression. zipOutput.SetLevel(9); DirectoryInfo directory = new DirectoryInfo(sourcePath); foreach (System.IO.FileInfo file in directory.GetFiles()) { // Get local path and create stream to it. String localFilename = file.FullName; //ignore directories or folders //ignore Thumbs.db file since this probably will throw an exception //another process could be using it. e.g: Explorer.exe windows process if (!file.Name.Contains("Thumbs") && !Directory.Exists(localFilename)) { using (FileStream fileStream = new FileStream(localFilename, FileMode.Open, FileAccess.Read, FileShare.Read)) { // Read full stream to in-memory buffer. byte[] buffer = new byte[fileStream.Length]; fileStream.Read(buffer, 0, buffer.Length); // Create a new entry for the current file. ZipEntry entry = new ZipEntry(file.Name); entry.DateTime = DateTime.Now; // set Size and the crc, because the information // about the size and crc should be stored in the header // if it is not set it is automatically written in the footer. // (in this case size == crc == -1 in the header) // Some ZIP programs have problems with zip files that don't store // the size and crc in the header. entry.Size = fileStream.Length; fileStream.Close(); // Update entry and write to zip stream. zipOutput.PutNextEntry(entry); zipOutput.Write(buffer, 0, buffer.Length); // Get rid of the buffer, because this // is a huge impact on the memory usage. buffer = null; } } } // Finalize the zip output. zipOutput.Finish(); // Flushes the create and close. zipOutput.Flush(); zipOutput.Close(); } } } public static void unZipFile(string sourcePath, string targetPath) { if (!Directory.Exists(targetPath)) Directory.CreateDirectory(targetPath); using (ZipInputStream s = new ZipInputStream(File.OpenRead(sourcePath))) { ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { if (theEntry.Name != String.Empty) { using (FileStream streamWriter = File.Create(targetPath + "\\" + theEntry.Name)) { int size = 2048; byte[] data = new byte[2048]; while (true) { size = s.Read(data, 0, data.Length); if (size > 0) { streamWriter.Write(data, 0, size); } else { break; } } } } } } }
Oublié de mentionner que cela ignorera les fichiers "thumbs.db" du tout (ils sont un peu inutiles, je ne veux pas gâcher avec ces données)
Sinon, utilisez ionique. P>
Espace de noms est voir http://visualstudiomagazine.com/articles /2012/05/21/net-Framework-gets-zip.aspx pour une histoire. P> system.io.packing.zippackage code>. p>
DUP de Stackoverflow.com/Questtions/384955/...
@Ruben: Votez ensuite pour fermer ...
Vous devez arrêter de vous inquiéter et Love DuPes.