将.ts文件从Assets文件夹解压缩到内部存储(Xamarin.Android)

时间:2018-04-17 16:54:09

标签: c# android .net xamarin xamarin.android

所以问题很简单。我正在使用Xamarin.Android,我在Assets文件夹中有一个名为" MyZipFile.zip"的zip文件,我希望将其提取到以下路径:System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);

这听起来很简单,但我无法弄清楚如何通过AssetManager将资产读入内存,然后将其解压缩到目标位置。

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:1)

Android Java框架包含一个var xhr = new XMLHttpRequest(); xhr.open("GET", uriOfCachedPage, true); xhr.setRequestHeader("Cache-Control", "max-age=0"); xhr.send(); 包,所以在不添加任何额外的应用程序库的情况下,我直接使用它而不是使用C#框架代码,因此没有连接无法删除的膨胀。

所以基本上你要创建一个资产流并将其提供给Java.Util.Zip并迭代该zip流中的每个ZipInputStream,以创建到目的地路径的目录或文件。

UnZipAssets

ZipEntry

用法:

public void UnZipAssets(string assetName, string destPath)
{
    byte[] buffer = new byte[1024];
    int byteCount;

    var destPathDir = new Java.IO.File(destPath);
    destPathDir.Mkdirs();

    using (var assetStream = Assets.Open(assetName, Android.Content.Res.Access.Streaming))
    using (var zipStream = new ZipInputStream(assetStream))
    {
        ZipEntry zipEntry;
        while ((zipEntry = zipStream.NextEntry) != null)
        {
            if (zipEntry.IsDirectory)
            {
                var zipDir = new Java.IO.File(Path.Combine(destPath, zipEntry.Name));
                zipDir.Mkdirs();
                continue;                                                 
            }

            // Note: This is deleting existing entries(!!!) for debug purposes only...
            #if DEBUG
            if (File.Exists(Path.Combine(destPath, zipEntry.Name)))
                File.Delete(Path.Combine(destPath, zipEntry.Name));
            #endif

            using (var fileStream = new FileStream(Path.Combine(destPath, zipEntry.Name), FileMode.CreateNew))
            {
                while ((byteCount = zipStream.Read(buffer)) != -1)
                {
                    fileStream.Write(buffer, 0, byteCount);
                }
            }
            Log.Debug("UnZipAssets", zipEntry.Name);
            zipEntry.Dispose();
        }
    }
}

注意:即使通过资产/ zip传输速度很快,根据zip条目的数量/大小以及正在写入条目的flash的速度,这应该在后台线程上完成,以免阻止UI线程并导致ANR