我在我的Chromebook上使用免费的Chrome开发者编辑器摸索。我正在尝试使用fileSystem
来读取和写入.txt文件。它完全被包裹起来,完全不像C一样。我再也不知道我是否被允许做某事,更不用说找到合适的地方了解。
我认为我可以使用Files thingy看到的文件位于我允许播放的沙箱中(意思是,应用程序可以访问的文件夹?)根名为Downloads。果然,如果我使用所有点调用和回调参数进行读取,就像在developer.chrome.com/apps/filesystem中的示例一样,它可以工作。但我必须得到提示 每次都进行读写操作。
Googling想出了这个伎俩:(我认为它实际上是在stackoverflow中)chrome.runtime
调用getPackagedDirectoryEntry
,这似乎给了我一个句柄我的应用。大!这就是我不需要经历的提示。无论如何,对于readfile。
但是然后尝试将相同的技巧应用于writefile并不起作用。事实上,它没有什么可辨别的。没有错误,没有投诉。没有。即使带有提示的写文件工作正常(因此我可能有权限和Blob构造正确。)该怎么办?
这是我的代码:
function test(){
// Samsung 303C Chromebook - Chrome Dev Editor - /Downloads/Daily/main.js
// prompted write
chrome.fileSystem.chooseEntry({type:'saveFile'},function(a){
a.createWriter(function(b){
b.write(new Blob(["Programming fun"],{type:'text/plain'}));
},function(e){trace.innerText = 'error is ' + e;});
});
// unprompted read
chrome.runtime.getPackageDirectoryEntry(function(a){
a.getFile('text.txt',{},function(b){
b.file(function(c){
var d = new FileReader();
d.onloadend = function(){trace.innerText = this.result;};
d.readAsText(c);
});
});
});
// unprompted write - why not?
chrome.runtime.getPackageDirectoryEntry(function(a){
a.getFile('new.txt',{create:true},function(b){
b.createWriter(function(c){
c.write(new Blob(["Miss Manners fan"],{type:'text/plain'}));
},function(e){trace.innerText = 'error is ' + e;});
});
});
}
答案 0 :(得分:2)
公平地说,Filesystem API是一大堆回调,被淹没在其中并不是不合理的。
它是not currently documented,但chrome.runtime.getPackageDirectoryEntry
会返回只读 DirectoryEntry
,并且无法使其成为可写(specifically blacklisted )。
您可能看不到错误,因为它在getFile
阶段失败,您没有错误处理程序。
不幸的是,对于Chrome应用,写出真实文件系统的唯一选择是提示用户。但是,您可以retain the entry只询问一次。
如果您不需要写入真实的文件系统但只需要内部存储,HTML Filesystem API可以帮助您(是的,它被标记为已废弃,但Chrome自chrome.fileSystem
构建以来一直保留它在它上面。)
Extensions还可以访问chrome.downloads
API,支持写入(但不能读取)Downloads文件夹。
P.S。您在“文件”应用中看到的是ChromeOS +挂载的云文件系统(例如Google云端硬盘)中的“真实”本地文件系统
答案 1 :(得分:0)
您可以使用基本网络Filesystem API。首先,添加"unlimitedStorage" permission。然后,将打包的文件复制到沙盒文件系统,如下所示:
chrome.runtime.getPackageDirectoryEntry(function(package) {
package.getMetadata(function(metadata) {
webkitRequestFileSystem(PERSISTENT, metadata.size, function(filesystem) {
package.copyTo(filesystem.root)
})
})
})