.Net Zip Up files

后端 未结 6 1314
不思量自难忘°
不思量自难忘° 2020-12-06 02:38

Whats the best way to zip up files using C#? Ideally I want to be able to seperate files into a single archive.

相关标签:
6条回答
  • 2020-12-06 02:41

    You can use DotNetZip to archieve this. It´s free to use in any application.

    Here´s some sample code:

       try
       {
         // for easy disposal
         using (ZipFile zip = new ZipFile())
         {
           // add this map file into the "images" directory in the zip archive
           zip.AddFile("c:\\images\\personal\\7440-N49th.png", "images");
           // add the report into a different directory in the archive
           zip.AddFile("c:\\Reports\\2008-Regional-Sales-Report.pdf", "files");
           zip.AddFile("ReadMe.txt");
           zip.Save("MyZipFile.zip");
         }
       }
       catch (System.Exception ex1)
       {
         System.Console.Error.WriteLine("exception: " + ex1);
       }
    
    0 讨论(0)
  • 2020-12-06 02:43

    Have you looked at SharpZipLib?

    I believe you can build zip files with classes in the System.IO.Packaging namespace - but every time I've tried to look into it, I've found it rather confusing...

    0 讨论(0)
  • 2020-12-06 02:45

    This is now built into the framework if you have version 4.5+

    Otherwise, use Ionic.

    Namespace is System.IO.Packaging.ZIPPackage.

    See http://visualstudiomagazine.com/articles/2012/05/21/net-framework-gets-zip.aspx for a story.

    0 讨论(0)
  • 2020-12-06 02:54

    There are a few librarys around - the most popular of which are DotNetZip and SharpZipLib.

    0 讨论(0)
  • 2020-12-06 03:01

    Take a look at this library: http://www.icsharpcode.net/OpenSource/SharpZipLib/

    It is pretty comprehensive, it deals with many formats, is open-source, and you can use in closed-source commercial applications.

    It is very simple to use:

    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();
    
    0 讨论(0)
  • 2020-12-06 03:01

    Hi i created two methods with the ShapLib library (you can download it here http://www.icsharpcode.net/opensource/sharpziplib/) that would like to share, they are very easy to use just pass source and target path (fullpath including folder/file and extension). Hope it help you!

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

    }

    0 讨论(0)
提交回复
热议问题