How can I unzip a file to a .NET memory stream?

前端 未结 6 582
鱼传尺愫
鱼传尺愫 2020-12-14 00:16

I have files (from 3rd parties) that are being FTP\'d to a directory on our server. I download them and process them even \'x\' minutes. Works great.

Now, some of th

相关标签:
6条回答
  • 2020-12-14 00:42

    Ok so combining all of the above, suppose you want to in a very simple way take a zip file called "file.zip" and extract it to "C:\temp" folder. (Note: This example was only tested for compress text files) You may need to do some modifications for binary files.

            using System.IO;
            using System.IO.Compression;
    
            static void Main(string[] args)
            {
                //Call it like this:
                Unzip("file.zip",@"C:\temp");
            }
    
            static void Unzip(string sourceZip, string targetPath)
            {
                using (var z = ZipFile.OpenRead(sourceZip))
                {
                    foreach (var entry in z.Entries)
                    {                    
                        using (var r = new StreamReader(entry.Open()))
                        {
                            string uncompressedFile = Path.Combine(targetPath, entry.Name);
                            File.WriteAllText(uncompressedFile,r.ReadToEnd());
                        }
                    }
                }
    
            }
    
    0 讨论(0)
  • 2020-12-14 00:45

    Zip compression support is built in:

    using System.IO;
    using System.IO.Compression;
    // ^^^ requires a reference to System.IO.Compression.dll
    static class Program
    {
        const string path = ...
        static void Main()
        {
            using(var file = File.OpenRead(path))
            using(var zip = new ZipArchive(file, ZipArchiveMode.Read))
            {
                foreach(var entry in zip.Entries)
                {
                    using(var stream = entry.Open())
                    {
                        // do whatever we want with stream
                        // ...
                    }
                }
            }
        }
    }
    

    Normally you should avoid copying it into another stream - just use it "as is", however, if you absolutely need it in a MemoryStream, you could do:

    using(var ms = new MemoryStream())
    {
        stream.CopyTo(ms);
        ms.Position = 0; // rewind
        // do something with ms
    }
    
    0 讨论(0)
  • 2020-12-14 00:46

    You can use SharpZipLib among a variety of other libraries to achieve this.

    You can use the following code example to unzip to a MemoryStream, as shown on their wiki:

    using ICSharpCode.SharpZipLib.Zip;
    
    // Compresses the supplied memory stream, naming it as zipEntryName, into a zip,
    // which is returned as a memory stream or a byte array.
    //
    public MemoryStream CreateToMemoryStream(MemoryStream memStreamIn, string zipEntryName) {
    
        MemoryStream outputMemStream = new MemoryStream();
        ZipOutputStream zipStream = new ZipOutputStream(outputMemStream);
    
        zipStream.SetLevel(3); //0-9, 9 being the highest level of compression
    
        ZipEntry newEntry = new ZipEntry(zipEntryName);
        newEntry.DateTime = DateTime.Now;
    
        zipStream.PutNextEntry(newEntry);
    
        StreamUtils.Copy(memStreamIn, zipStream, new byte[4096]);
        zipStream.CloseEntry();
    
        zipStream.IsStreamOwner = false;    // False stops the Close also Closing the underlying stream.
        zipStream.Close();          // Must finish the ZipOutputStream before using outputMemStream.
    
        outputMemStream.Position = 0;
        return outputMemStream;
    
        // Alternative outputs:
        // ToArray is the cleaner and easiest to use correctly with the penalty of duplicating allocated memory.
        byte[] byteArrayOut = outputMemStream.ToArray();
    
        // GetBuffer returns a raw buffer raw and so you need to account for the true length yourself.
        byte[] byteArrayOut = outputMemStream.GetBuffer();
        long len = outputMemStream.Length;
    }
    
    0 讨论(0)
  • 2020-12-14 00:47
    using (ZipArchive archive = new ZipArchive(webResponse.GetResponseStream()))
    {
         foreach (ZipArchiveEntry entry in archive.Entries)
         {
            Stream s = entry.Open();
            var sr = new StreamReader(s);
            var myStr = sr.ReadToEnd();
         }
    } 
    
    0 讨论(0)
  • 2020-12-14 00:47

    Looks like here is what you need:

    using (var za = ZipFile.OpenRead(path))
    {
        foreach (var entry in sa.Entries)
        {
            using (var r = new StreamReader(entry.Open()))
            {
                //your code here
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-14 00:48

    You can use ZipArchiveEntry.Open to get a stream.

    This code assumes the zip archive has one text file.

    using (FileStream fs = new FileStream(path, FileMode.Open))
    using (ZipArchive zip = new ZipArchive(fs) )
    {
        var entry = zip.Entries.First();
    
        using (StreamReader sr = new StreamReader(entry.Open()))
        {
            Console.WriteLine(sr.ReadToEnd());
        }
    }
    
    0 讨论(0)
提交回复
热议问题