如何在没有提示的情况下在Google Chrome应用中编写文件?

时间:2015-08-25 17:11:07

标签: javascript file-io google-chrome-app chromebook chrome-dev-editor

我在我的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;});
    });
  });
}    

2 个答案:

答案 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)
    })
  })
})