首页 新闻 搜索 专区 学院

文件夹压缩到内存流,并将内存流转换成压缩文件,压缩文件一直打不开.

0
悬赏园豆:60 [待解决问题]

在网上找了一个压缩文件夹的例子,需要要把压缩文件保存到流中,不知道为什么流转换成文件就一直打开失败

代码如下:

  class Class1
    {
        public static void Main(string[] args)
        {
            var zipFileDirectory = ZipFileDirectory("C:\\test\\test1");
      File.WriteAllBytes("C:\\test\\test1.zip", ZipFile.ToArray());
        }
        private static byte[] ZipFileDirectory(string strDirectory)
        {
            using (System.IO.MemoryStream ZipFile = new MemoryStream())
            {
                using (ZipOutputStream s = new ZipOutputStream(ZipFile))
                {
                    s.SetLevel(9);
                    ZipSetp(strDirectory, s, "");
                    var buffer = ZipFile.ToArray();
                    return buffer;
                }
            }
        }

        private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath, List<string> files = null)
        {
            if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar)
            {
                strDirectory += Path.DirectorySeparatorChar;
            }

            string[] filenames = Directory.GetFileSystemEntries(strDirectory);


            foreach (string file in filenames)// 遍历所有的文件和目录
            {
                if (files != null && !files.Contains(file))
                {
                    continue;
                }
                if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
                {
                    string pPath = parentPath;
                    pPath += Path.GetFileName(file);
                    pPath += "\\";
                    ZipSetp(file, s, pPath, files);
                }
                else // 否则直接压缩文件
                {
                    //打开压缩文件
                    string fileName = parentPath + Path.GetFileName(file);
                    ZipEntry entry = new ZipEntry(fileName) { DateTime = DateTime.Now };

                    s.PutNextEntry(entry);
                    using (FileStream fs = File.OpenRead(file))
                    {
                        int sourceBytes;
                        do
                        {
                            byte[] buffer = new byte[2048];
                            sourceBytes = fs.Read(buffer, 0, buffer.Length);
                            s.Write(buffer, 0, sourceBytes);
                        } while (sourceBytes > 0);

                    }
                }
            }
        }
    }

narojay的主页 narojay | 初学一级 | 园豆:14
提问于:2020-06-04 16:56
< >
分享
所有回答(2)
0

压缩是包,不是具体的文件,需要打开具体的文件流 然后保存再放入压缩包,而不是直接读取压缩包流

光明中的黑手 | 园豆:135 (初学一级) | 2020-06-04 18:04

using (System.IO.MemoryStream ZipFile = new MemoryStream()) 如果这边改成fileStream 是可以的生成文件到磁盘,但是目前的需求是不要把压缩文件生成到磁盘 而是直接返回给浏览器下载.

支持(0) 反对(0) narojay | 园豆:14 (初学一级) | 2020-06-04 21:30
0
 using (ZipOutputStream s = new ZipOutputStream(ZipFile))
                {
                    s.SetLevel(9);
                    ZipSetp(strDirectory, s, "");
                    s.Finish();
                    var buffer = ZipFile.ToArray();
                    return buffer;
                }

加个s.Finush()就可以了

narojay | 园豆:14 (初学一级) | 2020-06-08 16:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册