NativeScript:如何将文件从应用程序文件夹复制到用户可访问的文件夹?

NativeScript: How to copy a file from an apps folder to a user accessible folder?

我想将 storage.db 复制到文档或下载文件夹。获取文件路径非常简单:

const filePath = application.android.context.getDatabasePath("storage.db").getAbsolutePath();

但是,将该文件复制到用户有权访问的文件夹并不是那么容易。我搜索了整个论坛,但没有找到对我的情况有用的东西。

我正在使用 NativeScript 4.0.1 和 vanilla JS。

如果你想共享数据库文件,最简单的方法是使用 nativescript-share-file 插件,发送文件路径,它会给你一个带有意图选择器的漂亮对话框,用户可以选择通过电子邮件发送文件或者保存到本地文件夹等,

const shareFile = new ShareFile();
shareFile.open({
    path: filePath,
});

我终于找到了解决办法。我看到很多用户都在尝试实现这一点,希望这对大家有所帮助。

将此添加到您的 AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

安装 nativescript-permissions:

npm i nativescript-permissions

请求许可:

const permissions = require('nativescript-permissions');
permissions.requestPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, "");

需要必要的模块:

const fileSystemModule = require("tns-core-modules/file-system");
const application = require("application");

然后,在需要使用的地方创建这个函数:

function copyFile() {
    var myInput = new java.io.FileInputStream(appModule.android.context.getDatabasePath("storage.db").getAbsolutePath());
    
    var myOutput = new java.io.FileOutputStream("/storage/emulated/0/databases/storage.db");

    try {
        var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.class.getField("TYPE").get(null), 1024);
        var length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
    }
    catch (err) {
        console.info("Error", err);
    }


    //Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
}
exports.copyFile = copyFile;

在我的例子中,文件 storage.db 将被复制到 /storage/emulated/0/databases。如果您需要创建文件夹,只需执行以下操作:

try {
        var javaFile = new java.io.File("/storage/emulated/0/newfolder");
        if (!javaFile.exists()) {
            javaFile.mkdirs();
            javaFile.setReadable(true);
            javaFile.setWritable(true);
        }
    }
    catch (err) {
        console.info("Error", err);
    }

如果目标文件夹中有与您要复制的文件同名的文件,您需要先将其删除。这就是为什么你应该创建一个特定的文件夹以保证它是空的。