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

时间:2019-01-27 02:55:27

标签: javascript fs emscripten webassembly

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

许多小时以来,我一直在尝试使用emscripten的File System API,但我一无所获。

我已经阅读过此relevant question,并且emscripten doc声明相同:

  • 如果您的C / C ++代码确实使用文件,则文件系统支持将自动包括在内。

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

#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. 我可以通过某种方式下载创建的文件吗?

谢谢您的时间。

1 个答案:

答案 0 :(得分:1)

TLDR; 别指望您可以在浏览器中的计算机上编写任何内容。

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

WebAssembly也不例外。它只是一个虚拟机,可以运行用Java语言以外的语言编写的代码。请记住,WebAssembly由JavaScript引擎运行。所以说“我没有JS背景”。只是一个无效的陈述。 JS不能做的是WebAssembly不能做的。

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