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);
}
如果目标文件夹中有与您要复制的文件同名的文件,您需要先将其删除。这就是为什么你应该创建一个特定的文件夹以保证它是空的。
我想将 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);
}
如果目标文件夹中有与您要复制的文件同名的文件,您需要先将其删除。这就是为什么你应该创建一个特定的文件夹以保证它是空的。