【问题标题】:Renaming / moving files using File System Access API (javascript)使用文件系统访问 API (javascript) 重命名/移动文件
【发布时间】:2021-11-18 16:19:27
【问题描述】:

我一直在关注this article,以允许用户(半)自动将客户端生成的 XML 文件保存到特定的本地文件夹。第三方程序正在监视此文件夹,并将处理其内容并在另一个文件中输出内容。

问题是从创建文件到使用 close() 方法将内容实际写入文件大约需要 250 毫秒。

有时第三方程序会检测到文件已创建并尝试在写入之前读取其内容。该程序不支持在尝试读取文件内容之前添加延迟。

我已经考虑将文件写入一个临时位置并在其关闭后将其移动,但使用此 API 似乎无法做到这一点。重命名文件也是如此。

使用普通对话框创建/下载文件可能可行,但这需要手动步骤,而使用文件系统访问 API 可以避免。

另一种解决方案是安装一个本地程序,该程序可以在关闭时将文件从临时文件夹移动到程序监视文件夹,但我宁愿避免在客户端上安装软件。

有没有其他方法可以避免这个问题?

谢谢

【问题讨论】:

  • 如果您说的是临时 .crswap 文件。 crbug.com/1168715 中提到了一些解决方法,但使用起来似乎很乏味。
  • .crswap 文件没问题。问题基本上是一个空文件最初是由 getFileHandler(filename, {create: true}) 创建的,只有在~250 ms 之后才是写入文件的实际内容(临时 .crswap 文件中的内容被复制到空文件中之前创建的文件)。如果我可以等待创建文件直到关闭它,问题就会解决。
  • 啊,看来移动功能现在正在积极开发中。它在带有 chrome://flags/#enable-experimental-web-platform-features 标志的 Canary 中可用。
  • 谢谢!刚刚试了一下,现在移动和重命名都可以了。

标签: javascript file-system-access-api


【解决方案1】:

现在有一种重命名和移动文件的方法(目前在 Chrome 96 中实现,位于实验性网络平台功能标志后面):

// Get references to a file and a directory.
const [file] = await showOpenFilePicker();
const directory = await showDirectoryPicker();

// Rename the file.
await file.rename('new_name');
// Move the file to a new directory.
await file.move(directory);
// Move the file to a new directory and rename it.
await file.move(directory, 'newer_name');

您可以通过订阅this PR 来遵循规范工作。

【讨论】:

  • 我尝试使用最新的(非金丝雀)Chrome (v96.0.4664.45) 和启用的实验功能创建和移动文件,但是我收到“DOMException: The user aborted一个请求”,每当我试图移动文件时。如果我不采取行动,一切都会正常进行。相同的代码在金丝雀中完美运行。
  • 是的,这是意料之中的,因为该功能仅在 98 中完全实现。它仅在早期版本中部分实现(这就是它隐藏在标志后面的原因)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2019-01-23
  • 2014-08-01
  • 2016-10-11
相关资源
最近更新 更多