【问题标题】:How to write file in Google Chrome App without prompting?如何在没有提示的情况下在 Google Chrome App 中写入文件?
【发布时间】:2015-08-25 17:11:07
【问题描述】:

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

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

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

但是尝试将相同的技巧应用于写入文件并没有奏效。事实上,它没有做任何可辨别的事情。没有错误,没有抱怨。没有。即使带有提示的写入文件工作正常(所以大概我有权限和 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 个空格开头),您的问题就很清楚了。我会尽快回复。
  • 顺便说一句,您的问题不再包含问题,只有代码。请正确编辑它 - 当你这样做时,我已经准备好了答案。
  • 非常感谢您的编辑!我从这个问题中剪掉了一点多余的绒毛,赞成努力并回答了。

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


【解决方案1】:

说句公道话,Filesystem API 是一大堆回调,淹没在其中并非没有道理。

它是not currently documented,但chrome.runtime.getPackageDirectoryEntry 返回一个只读 DirectoryEntry,并且没有办法让它可写(它是specifically blacklisted)。

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

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


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

扩展程序还可以访问chrome.downloads API,该 API 可以写入(但不读取)下载文件夹。


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

【讨论】:

  • 非常感谢!你让我免于大量测试含糊的建议和阅读不相关的教程和不完整的文档。
【解决方案2】:

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

chrome.runtime.getPackageDirectoryEntry(function(package) {
  package.getMetadata(function(metadata) {
    webkitRequestFileSystem(PERSISTENT, metadata.size, function(filesystem) {
      package.copyTo(filesystem.root)
    })
  })
})

【讨论】:

    猜你喜欢
    • 2018-12-20
    • 2015-05-15
    • 2021-10-30
    • 2011-02-02
    • 1970-01-01
    • 2016-09-11
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多