在网上找了一个压缩文件夹的例子,需要要把压缩文件保存到流中,不知道为什么流转换成文件就一直打开失败
代码如下:
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);
}
}
}
}
}
压缩是包,不是具体的文件,需要打开具体的文件流 然后保存再放入压缩包,而不是直接读取压缩包流
using (System.IO.MemoryStream ZipFile = new MemoryStream()) 如果这边改成fileStream 是可以的生成文件到磁盘,但是目前的需求是不要把压缩文件生成到磁盘 而是直接返回给浏览器下载.
using (ZipOutputStream s = new ZipOutputStream(ZipFile))
{
s.SetLevel(9);
ZipSetp(strDirectory, s, "");
s.Finish();
var buffer = ZipFile.ToArray();
return buffer;
}
加个s.Finush()
就可以了