3

我在 Chromebook 上摸索着免费的 Chrome Dev Editor。我正在尝试使用fileSystem来读取和写入 .txt 文件。这一切都非常紧凑,一点也不像 C 中的那样。我什至无法判断我是否被允许做某事,更不用说在哪里找到合适的地方了。

我认为我可以使用 Files thingy 看到的文件位于允许我在其中播放的沙箱中(意思是应用程序可以访问的文件夹?)根称为下载。果然,如果我使用所有点调用和回调参数进行读取,如 developer.chrome.com/apps/filesystem 中的示例所示,它就可以工作。但是我每次读写都必须有提示。

再用谷歌搜索一下这个技巧:(我认为它实际上是在 stackoverflow 中)一个chrome.runtime调用,getPackagedDirectoryEntry,这似乎让我可以处理我的应用程序的文件夹。伟大的!这就是我不需要经过提示的全部内容。无论如何,对于读取文件。

但是随后尝试将相同的技巧应用于写入文件并没有奏效。事实上,它没有做任何可辨别的事情。没有错误,没有抱怨。没有什么。即使带有提示的写入文件工作正常(所以大概我拥有权限和 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;});
    });
  });
}    
4

2 回答 2

2

公平地说,文件系统 API 是一大堆回调,淹没在其中并非没有道理。

目前没有记录,但chrome.runtime.getPackageDirectoryEntry返回一个read-only DirectoryEntry,并且没有办法让它可写(它特别被列入黑名单)。

您可能看不到错误,因为它在getFile阶段失败,您没有错误处理程序。

不幸的是,对于 Chrome 应用程序,写入真实文件系统的唯一选择是提示用户。但是,您可以保留该条目并只询问一次。


如果你不需要写出真实的文件系统而只需要内部存储,HTML Filesystem API可以帮助你(是的,它被标记为废弃,但 Chrome 维护它,因为它chrome.fileSystem是建立在它之上的)。

扩展还可以访问chrome.downloads允许写入(但不读取)下载文件夹的 API。


PS 你在文件应用中看到的是你在 ChromeOS 中的“真实”本地文件系统 + 挂载的云文件系统(例如 Google Drive)

于 2015-08-27T20:18:21.080 回答
0

您可以使用基本的网络文件系统 API。首先,添加“unlimitedStorage”权限。然后,将打包的文件复制到沙盒文件系统,如下所示:

chrome.runtime.getPackageDirectoryEntry(function(package) {
  package.getMetadata(function(metadata) {
    webkitRequestFileSystem(PERSISTENT, metadata.size, function(filesystem) {
      package.copyTo(filesystem.root)
    })
  })
})
于 2015-08-26T03:34:38.703 回答