Скомпилированный TIFF. js с Emscripten не имеет доступа к FS - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь скомпилировать TIFF. js в файл WASM и клонировал последнюю версию https://github.com/seikichi/tiff.js/ В настоящее время он присутствует в репозитории npmjs, но в форме asm js. Он компилируется без ошибок (для правильной сборки потребовались небольшие изменения), но каким-то образом код с «нативной» стороны полностью игнорирует файловую систему Emscripten в памяти. Со стороны JavaScript я могу запустить что-то вроде этого:

var fp = Module.FS.open("/testfile.tiff", "w");
Module.FS.write(fp, new Uint8Array([22,23,24,25,26,27]), 0,6,0,true);
Module.FS.close(fp);

Это прекрасно работает - я могу FS.stat () этот файл размером JavaScript. Однако, если я добавлю функцию, подобную этой, в собственный код

bool FileExist(char *filename) {
  struct stat   buffer;   
  return (stat (filename, &buffer) == 0);
}

и вызову ее из JavaScript, она всегда говорит false - она ​​не видит файл. Даже если я создаю файл на собственной стороне, а затем проверяю, существует ли он, его там не будет. Я делаю что-то не так, но не вижу, что и где?

Я также пытался скомпилировать версию asm js из исходных кодов и получил тот же результат - не могу увидеть файлы в нативном коде, поэтому я Предположим, это не связано с компиляцией WASM, а является более общим.

Я пытался создать отдельный проект, просто чтобы проверить, работает ли у меня FS, и в очень простой установке с одним файлом все работает просто отлично - Я могу создавать файлы из JS и Native и видеть все с обеих сторон.

Редактировать # 1: Я пытался протестировать веб-страницу из gh-страниц tiff. js repo, и это это код, который я поместил в нативную часть, в "export. c"

bool TestFile(char *filename)
{
  struct stat buffer;
  bool result = (stat(filename, &buffer) == 0);

  perror(0);

  return result;
}

Это то, что выполняется после получения изображения TIFF

const uint8arr = new Uint8Array(buffer);

console.log(uint8arr.length);

const filename = `image.tif`;
const path = `/${filename}`;

const stream = FS.open(path, "w");
FS.write(stream, uint8arr, 0, uint8arr.length, 0, true);
FS.close(stream);

console.log('FS.stat: ', FS.stat(path));

console.log('Module._TestFile: ', Module._TestFile(path));

И это это то, что я получаю в консоли браузера

8609
upload.html:86 FS.stat:  {dev: 1, ino: 20, mode: 33206, nlink: 1, uid: 0, …}
tiff.js:1 No such file or directory
   put_char @ tiff.js:1
   write @ tiff.js:1
   write @ tiff.js:1
   doWritev @ tiff.js:1
   _fd_write @ tiff.js:1
   (anonymous) @ wasm-00509d86-761:1
   (anonymous) @ wasm-00509d86-768:1
   (anonymous) @ wasm-00509d86-769:1
   (anonymous) @ wasm-00509d86-774:1
   (anonymous) @ wasm-00509d86-37:1
   Module._TestFile @ tiff.js:1
   init @ upload.html:88
   (anonymous) @ upload.html:174
   load (async)
   show @ upload.html:163
   (anonymous) @ upload.html:207
   dispatch @ jquery-2.0.3.min.js:5
   y.handle @ jquery-2.0.3.min.js:5
upload.html:88 Module._TestFile:  0

Когда я делаю то же самое в пустом проекте, он отлично работает.

...