将文件从插件复制到配置文件文件夹
Copy file from addon to profile folder
我正试图从我的扩展目录中的数据文件夹复制一个sqlite数据库,到配置文件文件夹,以便使用它。
所以现在,我正在尝试:
const {Cc, Ci, Cu} = require("chrome");
const {NetUtils} = Cu.import("resource://gre/modules/NetUtil.jsm");
const data = require('sdk/self').data;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/FileUtils.jsm");
var file = Cc["@mozilla.org/file/directory_service;1"].
getService(Ci.nsIProperties).
get("TmpD", Ci.nsIFile);
file.append("searchEngines.sqlite");
file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0666);
// Then, we need an output stream to our output file.
var ostream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream);
ostream.init(file, -1, -1, 0);
// Finally, we need an input stream to take data from.
var iStreamData = NetUtil.ioService.newChannel(data.url("searchEngines.sqlite"), null, null).open();
let istream = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream);
istream.setData(iStreamData, iStreamData.length);
NetUtil.asyncCopy(istream, ostream, function(aResult) {
console.log(aResult); // return 0
})
console.log(FileUtils.getFile("ProfD", ["searchEngines.sqlite"]).exists()); // return false
let dbConn = Services.storage.openDatabase(file);
该文件似乎存在,因为console.log(file.exists())
返回FALSE,而没有填充(console.log(aResult)
返回0)。
我的错误在哪里,有没有更好的方法?
除了使用同步I/O(用.open
而不是.asyncOpen
打开通道)之外,NetUtil.asyncCopy
的操作仍然是异步的,这意味着代码
NetUtil.asyncCopy(istream, ostream, function(aResult) {
console.log(aResult); // return 0
})
console.log(FileUtils.getFile("ProfD", ["searchEngines.sqlite"]).exists()); // return false
let dbConn = Services.storage.openDatabase(file);
将尝试在拷贝完成之前打开文件 !但是,file.exists()
很可能为真,因为您已经打开了文件进行写入。只是这个文件仍然是空白的,因为数据拷贝还没有完成(甚至还没有开始)。(实际上,这是真的,因为你在ProfD
中检查searchEngines.sqlite
,而不是TmpD
,但如果你纠正了前面的语句将适用)。
你只能在回调.asyncCopy
完成后使用该文件,例如
NetUtil.asyncCopy(istream, ostream, function(aResult) {
console.log(aResult);
console.log(FileUtils.getFile("ProfD", ["searchEngines.sqlite"]).exists()); // return false
let dbConn = Services.storage.openDatabase(file);
// ...
});
PS:您可能想要.asyncOpen
通道,然后使用NetUtil.asyncFetch
并将结果流传递给.asyncCopy
,以便对较小的文件进行真正的异步,因为这首先将内容缓存到内存中。
对于大文件,您可以创建NetUtil.asyncFetch
实现的变体,将.outputStream
端直接提供给NetUtils.asyncCopy
。这有点复杂,所以我不会详细地写出来,直到有人真正对此感兴趣并提出相应的问题。
编辑,我是这样写的:
const data = require('sdk/self').data;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/NetUtil.jsm");
function copyDataURLToFile(url, file, callback) {
NetUtil.asyncFetch(url, function(istream) {
var ostream = Cc["@mozilla.org/network/file-output-stream;1"].
createInstance(Ci.nsIFileOutputStream);
ostream.init(file, -1, -1, Ci.nsIFileOutputStream.DEFER_OPEN);
NetUtil.asyncCopy(istream, ostream, function(result) {
callback && callback(file, result);
});
});
}
var file = Services.dirsvc.get("TmpD", Ci.nsIFile);
file.append("searchEngines.sqlite");
copyDataURLToFile(data.url("searchEngine.sqlite"), file, function(file, result) {
console.log(result);
console.log(file.exists());
console.log(file.fileSize);
});
尝试使用OS。文件更直接。
Cu.import("resource://gre/modules/FileUtils.jsm");
Cu.import("resource://gre/modules/osfile.jsm")
var fromPath = FileUtils.getFile("ProfD", ["searchEngines.sqlite"]).path;
var toPath = FileUtils.getFile("TmpD", ["searchEngines.sqlite"]).path;;
var promise = OS.File.copy(fromPath, toPath);
var dbConn;
promise.then(
function(aStat) {
alert('success will now open connection');
dbConn = Services.storage.openDatabase(toPath);
},
function(aReason) {
console.log('promise rejected', aReason);
alert('copy failed, see console for details');
}
);
相关文章:
- 将配置文件文件夹移动到sdcardfirefoxmobile14.0
- Grunt imagemin-观察多个文件/文件夹优化单个文件
- 将整个JavaScript文件文件夹添加到HTML5应用程序缓存中
- HTML或JavaScript,如何找出程序文件文件夹的位置
- 通过函数填充 Grunt 任务配置的“文件”属性
- 如何在没有配置.js文件的情况下使用 CKEditor
- 使用纯 JavaScript 创建文件/文件夹
- 基本脚本,它向自己发送一封包含从文件文件夹中随机选择的内容的邮件
- 如何在webpack中配置字体文件输出目录
- 巴贝尔节点不't编译时忽略指定的文件/文件夹
- 如何定义CKEditor用于搜索配置/语言文件的路径
- Chrome拖放文件/文件夹不工作
- 如何在SonarQube 4.4's技术债务计算中忽略文件/文件夹?
- OneDrive for Business是否有客户端javascript库提供文件/文件夹选择器控件?
- 将文件从插件复制到配置文件文件夹
- 从sd卡复制目录到“文件”;文件夹中
- 我如何设置和访问一个配置JSON文件的秘密信息的公共GitHub回购
- 配置grunt copy任务,排除文件/文件夹
- 无法获取配置json文件
- 用于检查CSS和JS文件文件夹的工具