WebAssembly/emscripten:从浏览器中将文件写入磁盘

WebAssembly/emscripten: write files to disk from within browser

我想在浏览器中执行一些 C 代码(使用 Firefox 64.0 进行测试)。 C 代码将文件写入磁盘。

我已经尝试使用 emscripten 的文件系统 API 好几个小时了,但我一无所获。

我读过这个 relevant question and the emscripten doc 说的一样:

这是我使用文件系统的测试代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
  FILE *f = fopen("testfile.txt", "w");
  if (f == NULL) {
      printf("Error opening file!\n");
      exit(1);
  }

  const char *text = "This is my test string";
  int i = 1234;
  fprintf(f, "Some text: %s; and an int: %d\n", text, i);

  fclose(f);
  printf("End of file.\n");
}

在我编译这段代码后:

emcc test.c -o test.html

然后用 Firefox 打开它,我最初希望文件保存到我的机器上。 (我没有 JS 背景。) 我现在几乎可以肯定它不是那样工作的。

该文件可通过以下方式作为 Uint8Array 访问:

var array = FS.readfile("testfile.txt")

在控制台中。

具体来说,我现在对这个感兴趣:

  1. 有没有办法从浏览器内部将文件写入我的本地文件系统?
  2. 我可以通过某种方式下载创建的文件吗?

感谢您的宝贵时间。

TLDR; 没想到你可以在浏览器上在你的机器上写任何东西。

现代网络浏览器的设计考虑到了安全性,因此它们是高度沙盒化的。他们永远不会允许网页 write/open 您机器上的本地文件。假设有人访问了您的网站,然后在他们的机器上创建了一个名为 testfile.txt 的文件,并且该网站在您每次按下刷新按钮时都在不断创建文件。

WebAssembly 也不例外。它只是 运行 用 Javascript 以外的语言编写的代码的虚拟机。请记住,WebAssembly 是 运行 的 JavaScript 引擎。所以说 "I have no JS background." 只是一个无效的陈述。 JS 做不到的就是 WebAssembly 做不到的。

根据 Emscripten File System Overview 文档,您创建的 文件将保留在内存中。 您必须将其转换为 Blob(这必须使用 JavaScript API)允许用户下载。