zoukankan      html  css  js  c++  java
  • 使用System.IO.Packaging.Package进行文件压缩所产生的问题

    最近在项目中需要进行文件压缩,即将打包好的压缩文件提供给用户,用户进行下载。

    获知微软提供了一个System.IO.Packaging.Package的类,从而可以进行打包,那么我就进行了使用。谁知道,这一用就用出事了。

    首先看代码吧。

    结构并不复杂,vs2010+mvc3,直接写在action里。(例子是这样写的)需要注意的是,System.IO.Packaging.Package是在WindowsBase.dll里的。

    private const long BUFFER_SIZE = 4096;
    public ActionResult DownLoad(int id)
    {
    //实际情况中,此处将会根据id从数据库中获得数据列表
    //此列表中将包括需要压缩的文件名
    try
    {
    byte[] file = null;
    //假设,有一个download目录,作为下载目录,其中包含若干文件
    string folder = Server.MapPath("~/download/");
    DirectoryInfo f
    = new DirectoryInfo(folder);
    using (MemoryStream ms = new MemoryStream())
    {
    using (Package zip = Package.Open(ms, FileMode.Create))//使用内存流打开
    {
    //在实际情况中,此处将会是一个循环,从数据库中获得一批需要进行压缩的文件路径
    //获得相对根路径
    Uri uri = PackUriHelper.CreatePartUri(new Uri("文件路径", UriKind.Relative));
    if (zip.PartExists(uri))//如果此文件已存在,删掉
    {
    zip.DeletePart(uri);
    }
    PackagePart part
    = zip.CreatePart(uri, "", CompressionOption.Normal);
    //使用文件流打开需要压缩的文件
    using (FileStream fileStream = new FileStream(folder + "文件路径", FileMode.Open, FileAccess.Read))
    {
    using (Stream dest = part.GetStream())
    {
    //将数据复制到stream中
    CopyStream(fileStream, dest);
    }
    }
    //此处对应循环结束
    }
    file
    = ms.ToArray();
    }
    return File(file, "application/x-zip-compressed", "myFile.zip");
    }
    catch (Exception ex)
    {

    return View("Error");
    }
    }

    private static void CopyStream(System.IO.Stream inputStream, System.IO.Stream outputStream)
    {
    long bufferSize = inputStream.Length < BUFFER_SIZE ? inputStream.Length : BUFFER_SIZE;
    byte[] buffer = new byte[bufferSize];
    int bytesRead = 0;
    long bytesWritten = 0;
    while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) != 0)
    {
    outputStream.Write(buffer,
    0, bytesRead);
    bytesWritten
    += bufferSize;
    }
    }

    虽然我对于流的理解并不是很好,但是大概的代码思路还是有的。感觉这里并没什么问题。可是,结果却并非我所想象的那样。

    首先,在本地进行测试,并无错误。

    然后部署到IIS中,其中包括iis7和iis6.一开始并不报错,但是后来就开始出错了。

    报的最频繁的错误就是,无法访问已关闭的流。

    还有一个是什么具体的忘记了。最直观的就是,当下载的压缩包并不大时,大概在20-30M左右,没事。一旦在大点,就开始报错了。

    这让我很不能理解。

    我在一台服务器上设置了everyone的权限,没事了,当去掉everyone的权限后,错误又出现了。

    此时,开始考虑错误。

    个人的想法是:压缩包从内存流中读取,然后通过文件流进行写入,此时应当会产生一个临时文件,但是这个临时文件的大小是受限的,一旦太大

    就无法继续进行写入了。从而关闭文件流。

    当然,到底是否是正确的,还无从得知。因为,到现在也没有获得正确的答案。

    最终使用了另外的一种压缩方法进行压缩。

    在此,将问题抛出,静等园内众神指点解惑。

    PS:貌似直接ouputstream不行。

  • 相关阅读:
    hdu 6010 Daylight Saving Time
    hdu 5999 The Third Cup is Free
    2011 USP Try-outs F. Auction of Services
    1449 砝码称重
    hdu 6205 card card card
    hdu 6201 transaction transaction transaction
    Codeforces 828D
    Codeforces Round #434 D
    zoj
    Codeforces Round #434 C
  • 原文地址:https://www.cnblogs.com/fengyishou/p/2043425.html
Copyright © 2011-2022 走看看