解压缩压缩文件后获取相同的目录结构

时间:2016-04-19 12:25:44

标签: c# unity3d

我从亚马逊服务器下载了zip文件(使用AWS SDK统一)。这个zip文件有一个文件夹,里面还有一个包含png文件的文件夹。当我从亚马逊服务器获得响应对象时,我将其作为字节数组读取并存储为.zip文件。当我双击zip文件时,我得到包含png文件的目录和子目录。现在我需要以编程方式解压缩该文件。我试图使用GZipStream解压缩它,它返回未压缩的字节数组。现在我如何保存这个字节数组,以便保留我的文件夹结构?我也不想使用第三方库来解压缩压缩文件。

void Start()     {

    UnityInitializer.AttachToGameObject (this.gameObject);
    client = new AmazonS3Client (mAccKey, mSecretKey, mRegion);
    Debug.Log ("Getting the presigned url\n");
    GetPreSignedUrlRequest request = new GetPreSignedUrlRequest ();
    request.BucketName = mBucketName;
    request.Key = mFileName;
    request.Expires = DateTime.Now.AddMinutes (5);
    request.Protocol = Protocol.HTTP;



    GetObjectRequest requestObject = new GetObjectRequest ();
    requestObject.BucketName = mBucketName;
    requestObject.Key = mFileName;
    Debug.Log ("Requesting for the " + mFileName + " contents" + "from the bucket\n" + mBucketName);

    client.GetObjectAsync(mBucketName, mFileName, (responseObj) =>
        {

            var response = responseObj.Response;
            if (response.ResponseStream != null)
            {

                Debug.Log("Recieving response\n");
                using (BinaryReader bReader=new BinaryReader(response.ResponseStream))
                {
                    byte[] buffer = bReader.ReadBytes((int)response.ResponseStream.Length);


                    var zippedPath=Application.persistentDataPath+"/"+zippedFile;
                    File.WriteAllBytes(zippedPath,buffer);

                    var unZippedPath=Application.persistentDataPath+"/"+unZipToFolder;
                    DirectoryInfo directory=Directory.CreateDirectory(unZippedPath);
                    byte[]compressedData=compress(buffer);

                    byte[] unCompressedData=decompress(compressedData);
                    //Debug.Log(unCompressedData.Length);
                    File.WriteAllBytes(unZippedPath+directory,unCompressedData);








                }
                Debug.Log("Response complete");

            }

        });
}


#region GZipStream
public static byte[] compress(byte[] data)
{
    using (MemoryStream outStream = new MemoryStream())
    {
        using (GZipStream gzipStream = new GZipStream(outStream, CompressionMode.Compress))
        using (MemoryStream srcStream = new MemoryStream(data))
            CopyTo(srcStream, gzipStream);
        return outStream.ToArray();
    }
}


public static byte[] decompress(byte[] compressed)
{
    using (MemoryStream inStream = new MemoryStream(compressed))
    using (GZipStream gzipStream = new GZipStream(inStream, CompressionMode.Decompress))
    using (MemoryStream outStream = new MemoryStream())
    {
        CopyTo(gzipStream, outStream);
        return outStream.ToArray();
    }
}

public static void CopyTo(Stream input, Stream output)
{
    byte[] buffer = new byte[16 * 1024];
    int bytesRead;
    while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
    {
        output.Write(buffer, 0, bytesRead);
    }
}

#endregion

}

zip文件中的文件夹结构images->样本图像 - > 10个png文件

1 个答案:

答案 0 :(得分:1)

GZipStream只能(de)压缩流。换句话说,您无法使用它来还原文件夹结构。使用ZipFile或者,如果您不能使用框架4.5,请使用SharpZipLib