繁体   English   中英

如何将一个TXT文件从Assets文件夹复制到SD /内部存储Android C#Xamarin

[英]How to copy one TXT File from Assets folder to SD / Internal Storage Android C# Xamarin

我正在尝试将素材资源中的TXT文件复制到SD卡/内部存储中。 所有示例均使用Java,是否可以用C#完成?

Java代码:

    final static String TARGET_BASE_PATH = "/sdcard/appname/voices/";

private void copyFilesToSdCard() {
    copyFileOrDir(""); // copy all files in assets folder in my project
}

private void copyFileOrDir(String path) {
    AssetManager assetManager = this.getAssets();
    String assets[] = null;
    try {
        Log.i("tag", "copyFileOrDir() "+path);
        assets = assetManager.list(path);
        if (assets.length == 0) {
            copyFile(path);
        } else {
            String fullPath =  TARGET_BASE_PATH + path;
            Log.i("tag", "path="+fullPath);
            File dir = new File(fullPath);
            if (!dir.exists() && !path.startsWith("images") && !path.startsWith("sounds") && !path.startsWith("webkit"))
                if (!dir.mkdirs())
                    Log.i("tag", "could not create dir "+fullPath);
            for (int i = 0; i < assets.length; ++i) {
                String p;
                if (path.equals(""))
                    p = "";
                else 
                    p = path + "/";

                if (!path.startsWith("images") && !path.startsWith("sounds") && !path.startsWith("webkit"))
                    copyFileOrDir( p + assets[i]);
            }
        }
    } catch (IOException ex) {
        Log.e("tag", "I/O Exception", ex);
    }
}

private void copyFile(String filename) {
    AssetManager assetManager = this.getAssets();

    InputStream in = null;
    OutputStream out = null;
    String newFileName = null;
    try {
        Log.i("tag", "copyFile() "+filename);
        in = assetManager.open(filename);
        if (filename.endsWith(".jpg")) // extension was added to avoid compression on APK file
            newFileName = TARGET_BASE_PATH + filename.substring(0, filename.length()-4);
        else
            newFileName = TARGET_BASE_PATH + filename;
        out = new FileOutputStream(newFileName);

        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1) {
            out.write(buffer, 0, read);
        }
        in.close();
        in = null;
        out.flush();
        out.close();
        out = null;
    } catch (Exception e) {
        Log.e("tag", "Exception in copyFile() of "+newFileName);
        Log.e("tag", "Exception in copyFile() "+e.toString());
    }

}

上面的代码将如何在C#中完成? 谢谢。

一个可能的解决方案看起来像我将数据库从Assets文件夹复制到设备的方法:

    public static async Task CopyDatabaseAsync(Activity activity)
    {
        var dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "YOUR_DATABASENAME");

        if (!File.Exists(dbPath))
        {
            try
            {
                using (var dbAssetStream = activity.Assets.Open("YOUR_DATABASENAME"))
                using (var dbFileStream = new FileStream(dbPath, FileMode.OpenOrCreate))
                {
                    var buffer = new byte[1024];

                    int b = buffer.Length;
                    int length;

                    while ((length = await dbAssetStream.ReadAsync(buffer, 0, b)) > 0)
                    {
                        await dbFileStream.WriteAsync(buffer, 0, length);
                    }

                    dbFileStream.Flush();
                    dbFileStream.Close();
                    dbAssetStream.Close();
                }
            }
            catch (Exception ex)
            {
                //Handle exceptions
            }
        }
    }

您可以使用ContinueWithOnCreate调用它

CopyDatabaseAsync().ContinueWith(t =>
{
     if (t.Status != TaskStatus.RanToCompletion)
         return;

     //your code here
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM