如何将一个TXT文件从Assets文件夹复制到SD/Internal Storage Android C#Xamarin

如何将一个TXT文件从Assets文件夹复制到SD/Internal Storage Android C#Xamarin,c#,android,file,xamarin,copy,C#,Android,File,Xamarin,Copy,我正在尝试将资产中的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 }

我正在尝试将资产中的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());
    }

}
最终静态字符串TARGET_BASE_PATH=“/sdcard/appname/voices/”;
私有void copyFilesToSdCard(){
CopyFileOrder(“”;//复制项目中资产文件夹中的所有文件
}
专用void copyFileOrder(字符串路径){
AssetManager AssetManager=this.getAssets();
字符串资产[]=null;
试一试{
Log.i(“tag”,“copyFileOrder()”+路径);
assets=assetManager.list(路径);
如果(assets.length==0){
复制文件(路径);
}否则{
字符串fullPath=目标\基本\路径+路径;
Log.i(“标记”,“路径=”+完整路径);
文件目录=新文件(完整路径);
如果(!dir.exists()&&!path.startsWith(“图像”)&&!path.startsWith(“声音”)&&!path.startsWith(“webkit”))
如果(!dir.mkdirs())
Log.i(“标记”,“无法创建目录”+完整路径);
对于(int i=0;i
上述代码将如何在C#中完成?
谢谢。

可能的解决方案可能类似于我将数据库从资产文件夹复制到设备的方法:

    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
            }
        }
    }
您可以使用
ContinueWith

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

     //your code here
});

所以我会用我的文件名而不是你的数据库?此外,此文件保存到何处?是的,使用文件名而不是_数据库名。此方法可以保存在项目中的任何位置。在要复制文件的位置调用它。确切位置是
Environment.SpecialFolder.Personal
?我可以添加子文件夹吗?请阅读有关特殊文件夹的文档。是的,可以创建子文件夹。无需关闭流,因为“using”关键字会自动关闭并处理它。