ファイルシステム API

Emscripten におけるファイル操作は、FS ライブラリによって提供されます。これは、Emscripten のすべての libc および libcxx ファイル I/O で内部的に使用されます。

注意

この API は、Linux/POSIX の ファイルシステム API触発されており、それぞれが非常に類似したインターフェースを提供します。

基になる動作も類似していますが、ネイティブ環境とブラウザ環境の違いにより、これは非現実的になる場合があります。たとえば、ユーザーおよびグループの権限は定義されていますが、FS.open() では無視されます。

Emscripten は主に同期ファイル I/O を使用するコードをコンパイルするため、FS メンバー関数の大部分は同期インターフェースを提供します(エラーは、FS.ErrnoError 型の例外を発生させることによって報告されます)。

Emscripten のファイルデータは、マウントされたファイルシステムによって分割されます。いくつかのファイルシステムが提供されています。MEMFS のインスタンスは、デフォルトで / にマウントされます。サブディレクトリ /home/web_user および /tmp は、いくつかの特殊なデバイスとストリーム(例:/dev/null/dev/random/dev/stdin/proc/self/fd)に加えて自動的に作成されます。詳細については、FS ライブラリの FS.staticInit() を参照してください。アプリケーションで データを永続化する必要がある場合は、NODEFS および IDBFS のインスタンスを他のディレクトリにマウントできます。

test/test_core.py の自動テスト(test_files を検索)には、この API の使用方法に関する多くの例が含まれています。チュートリアル では、コンパイルされた C/C++ から読み取ることができるようにファイルをプリロードする方法も示しています。

Emscripten でポートされたコードでのファイルシステムの動作方法の概要は、ファイルシステムの概要 で提供されています。

新しいファイルシステム: WasmFS

注意

現在のステータス:開発中

WasmFS は、既存の JavaScript バージョンを置き換える、Emscripten 用の高性能で完全にマルチスレッド化された WebAssembly ベースのファイルシステムレイヤーです。

JavaScript ベースのファイルシステムは、pthread がサポートされる前、および JS でコードを記述する方がより最適だったときに最初に記述されました。その結果、すべてのファイルシステム操作が行われるメインスレッドにプロキシする必要があるため、pthread ビルドではオーバーヘッドが発生します。WasmFS は、代わりに Wasm にコンパイルされ、完全にマルチスレッドをサポートしています。また、よりモジュール化され、拡張可能になることを目指しています。

設計ドキュメントリンク

GitHub 追跡イシュー

元の JS ファイルシステムで気付く可能性のある違いは次のとおりです。

  • 元の JS FS には、デフォルトで多くの JS コードが含まれていますが、WasmFS には含まれていません。その結果、FS.mkdir() のように独自の JS を記述すると、JS FS はすでにその API サポートを追加しており、すべてが正常に機能します。WasmFS では、すべてのビルドが肥大化するのを避けるために、完全な JS API を含めることをオプトインする必要があります。これを行うには、JS から完全なファイルシステム API を強制的にサポートする -sFORCE_FILESYSTEM を使用します。

  • WasmFS は内部で malloc を必要とするため、-sWASMFS -sMALLOC=none でビルドすることはできません。可能な限り最小の malloc が必要な場合は、-sMALLOC=emmalloc を使用します。(コードが実際には重要ではない方法でファイルを使用しない場合、オプティマイザーが WasmFS と malloc を削除できることに注意してください。)

ファイルシステムサポートの組み込み

Emscripten は、ファイルシステムサポートを含めるかどうかを自動的に決定します。多くのプログラムではファイルは必要ありません。また、ファイルシステムサポートはサイズが無視できないため、Emscripten はその理由が見られない場合は含めることを避けます。つまり、C/C++ コードがファイルにアクセスしない場合、FS オブジェクトおよびその他のファイルシステム API は出力に含まれません。また、C/C++ コードがファイルを使用している場合、ファイルシステムサポートは自動的に含まれます。したがって、通常は「正常に動作」し、これについてまったく考える必要はありません。

ただし、C/C++ コードがファイルを使用していないが、JavaScript から使用したい場合は、-sFORCE_FILESYSTEM を使用してビルドできます。これにより、コンパイラーは使用されていると認識しなくてもファイルシステムサポートを含めるようになります。

一方、ファイルシステムサポートコードを 含めない ようにしたい場合(musl および libc++ の構造上、printf や iostreams が原因で含まれる可能性があります)、-sFILESYSTEM=0 を使用してビルドできます。そのような場合に必要な場合は非常にシンプルな stdout サポートが含まれます。printf などの機能は十分ですが、ファイルシステムコードは追加されないため、コードサイズを大幅に削減できます。

永続データ

Emscripten でコンパイルされたアプリケーションは、通常、同期 I/O を想定しているため、Emscripten 自体が完全に同期インターフェースを備えたファイルシステムを提供します。

ただし、JavaScript のイベント駆動型の性質により、ほとんどの 永続的な ストレージオプションは非同期インターフェースのみを提供します。Emscripten は、実行コンテキストに応じて永続性を処理するのに役立つように、複数のファイルシステムFS.mount() でマウントできます。

ファイルシステム

注意

デフォルトでは MEMFS ファイルシステムのみが含まれます。他のすべてのファイルシステムは、-lnodefs.js (NODEFS)、-lidbfs.js (IDBFS)、-lworkerfs.js (WORKERFS)、または -lproxyfs.js (PROXYFS) を使用して明示的に有効にする必要があります。

MEMFS

これは、ランタイムが初期化されたときに / にマウントされるデフォルトのファイルシステムです。すべてのファイルは厳密にメモリ内に存在し、それらに書き込まれたデータはページがリロードされると失われます。

NODEFS

注意

このファイルシステムは、node.js 内で実行している場合にのみ使用されます。

このファイルシステムを使用すると、node 内のプログラムが、ホストファイルシステムのディレクトリ(マウント操作を介して)を Emscripten の仮想ファイルシステムのディレクトリにマップできます。node の同期 FS API を使用して、Emscripten ファイルシステムに書き込まれたデータをローカルディスクにすぐに永続化します。

例については、このテスト を参照してください。

NODERAWFS

注意

このファイルシステムは、node.js 内で実行している場合にのみ使用されます。

これは特別なバックエンドであり、通常のファイルシステムアクセスをすべて、FS.mount() を行う必要なく、直接 Node.js の操作に置き換えます。初期ワーキングディレクトリは、VFS ルートディレクトリではなく、process.cwd() と同じになります。このモードは、Node.js を直接使用して OS 上の実際のローカルファイルシステムにアクセスするため、コードは必ずしも OS 間で移植可能とは限りません。Node.js プログラムと同程度の移植性となり、これはつまり、基盤となる OS がアクセス許可やエラーなどをどのように処理するかの違いが顕著になる可能性があるということです。これまでのところ、主に Linux でテストされています。

この NODEFS に関するセクションをご覧ください。ここで、マウント操作を確認できます。これは NODERAWFS では不要です。

IDBFS

注意

このファイルシステムは、ブラウザ内でコードを実行する場合のみ使用します。

IDBFS ファイルシステムは、FS.syncfs() インターフェースを実装しており、呼び出されると、すべての操作を IndexedDB インスタンスに永続化します。

これは、ブラウザが永続ストレージのための同期 API を提供していないという制限を克服するために提供されており、そのため(デフォルトでは)すべての書き込みは一時的にメモリ内にのみ存在します。

IDBFS をマウントする際にマウントオプション autoPersist: true を渡すと、IDBFS ディレクトリツリーに変更が加えられるたびに、IndexedDB バックエンドに自動的に永続化されます。これにより、ユーザーは IDBFS マウントされたディレクトリツリーへの変更を永続化するために FS.syncfs を手動で呼び出す必要がなくなります。

WORKERFS

注意

このファイルシステムは、ワーカー内でコードを実行する場合のみ使用します。

このファイルシステムは、ワーカー内の File および Blob オブジェクトへの読み取り専用アクセスを提供し、データ全体をメモリにコピーすることなく、潜在的に巨大なファイルに使用できます。

PROXYFS

これにより、モジュールが別のモジュールのファイルシステムをマウントできます。これは、複数のモジュールがファイルの内容を手動で同期することなくファイルシステムを共有する必要がある場合に役立ちます。例:

// Module 2 can use the path "/fs1" to access and modify Module 1's filesystem
module2.FS.mkdir("/fs1");
module2.FS.mount(module2.PROXYFS, {
    root: "/",
    fs: module1.FS
}, "/fs1");

デバイス

Emscripten は、デバイス ID とデバイス固有のストリームコールバックのセットで構成される任意のデバイスドライバの登録をサポートしています。ドライバが FS.registerDevice() で登録されると、デバイスノードを作成して(FS.mkdev() を使用して)それを参照できます。

デバイスノードは、デバイスとファイルシステム間のインターフェースとして機能します。新しいノードを参照するストリームは、デバイスに登録されたストリームコールバックを継承し、すべての高レベル FS 操作がデバイスと透過的に対話できるようにします。

注意

すべてのデバイスは異なり、一意です。opencloseread、および write などの一般的なファイル操作は通常サポートされており(そして、相当する libc 関数を呼び出すための抽象化レイヤーを提供するためにファイルストリームによって継承されます)、各デバイスは、その固有の特性に基づいて必要なコールバックを実装する必要があります。

FS.makedev(ma, mi)

メジャー番号とマイナー番号を単一の一意の整数に変換します。これは、デバイスを表す ID として使用されます。

引数
  • ma – メジャー番号。

  • mi – マイナー番号。

FS.registerDevice(dev, ops)

指定されたデバイスドライバをコールバックのセットで登録します。

引数
  • devmakedev() を使用して作成された特定のデバイスドライバ ID。

  • ops (オブジェクト) – デバイスに必要なコールバックのセット。例については、NODEFS のデフォルトコールバックを参照してください。

標準 I/O デバイスの設定

Emscripten の標準 I/O は、仮想 /dev/stdin/dev/stdout、および /dev/stderr デバイスを経由して機能します。FS.init() を呼び出すことで、独自の I/O 関数を使用してそれらをセットアップできます。

デフォルトでは

  • stdin は、コマンドラインエンジンではターミナルから読み取り、ブラウザでは window.prompt() を使用します(どちらの場合も、行バッファリング付き)。

  • stdout は、そのような関数が定義されている場合は print 関数を使用し、コマンドラインエンジンではターミナルに、コンソールを持つブラウザではブラウザコンソールに出力します(これも行バッファリング付き)。

  • stderrstdout と同じ出力関数を使用します。

注意

すべての設定は、メインの run() メソッドが実行される前に行う必要があり、通常は Module.preRun を実装することによって行います。詳細については、コードとのインタラクションを参照してください。

FS.init(input, output, error)

stdinstdout、および stderr の標準 I/O デバイスをセットアップします。

デバイスは、次の(オプションの)コールバックを使用してセットアップされます。コールバックのいずれかが例外をスローした場合、デバイスが故障した場合と同じようにキャッチされて処理されます。

引数
  • input – 入力コールバック。プログラムが stdin から読み取ろうとするたびに、パラメータなしで呼び出されます。データが利用可能な場合は ASCII 文字コードを返し、利用可能でない場合は null を返す必要があります。

  • output – 出力コールバック。プログラムが stdout に書き込むたびに、ASCII 文字コードで呼び出されます。出力をフラッシュするために null で呼び出すこともできます。

  • error – エラーコールバック。これは output に似ていますが、データが stderr に書き込まれるときに呼び出される点が異なります。

ファイルシステム API

注意

FS.readdir() のように libc から派生した関数はすべて小文字の名前を使用しますが、FS.readFile() のように追加された関数はキャメルケースの名前を使用します。

FS.mount(type, opts, mountpoint)

type で指定された FS オブジェクトを mountpoint で指定されたディレクトリにマウントします。opts オブジェクトは、ファイルシステムタイプごとに固有です。

引数
  • typeファイルシステムタイプMEMFSNODEFSIDBFS、または WORKERFS

  • opts (オブジェクト) –

    基盤となるファイルシステムで使用される汎用設定オブジェクト。

    NODEFSroot パラメータを使用して、Emscripten ディレクトリを物理ディレクトリにマップします。たとえば、現在のフォルダを NODEFS インスタンスとしてマウントするには

    FS.mkdir('/working');
    FS.mount(NODEFS, { root: '.' }, '/working');
    

    WORKERFS は、提供されたファイルのフラットリストを mountpoint ディレクトリにマップするために、files および blobs パラメータを受け入れます。

    var blob = new Blob(['blob data']);
    FS.mkdir('/working');
    FS.mount(WORKERFS, {
      blobs: [{ name: 'blob.txt', data: blob }],
      files: files, // Array of File objects or FileList
    }, '/working');
    

    tools/file_packager--separate-metadata を使用して作成したファイルのパッケージを渡すこともできます。メタデータを JSON オブジェクトとして、データを blob として提供する必要があります

    // load metadata and blob using XMLHttpRequests, or IndexedDB, or from someplace else
    FS.mkdir('/working');
    FS.mount(WORKERFS, {
      packages: [{ metadata: meta, blob: blob }]
    }, '/working');
    

  • mountpoint (文字列) – ファイルシステムをマウントする既存のローカル Emscripten ディレクトリへのパス。絶対パスまたは現在のディレクトリからの相対パスを指定できます。

FS.unmount(mountpoint)

指定された mountpoint をアンマウントします。

引数
  • mountpoint (文字列) – アンマウントするディレクトリ。

FS.syncfs(populate, callback)

すべてのマウントされたファイルシステムを非同期的に反復処理および同期する役割を担います。

注意

現在、IDBFS ファイルシステムのみが、同期に必要なインターフェースを実装しています。他のすべてのファイルシステムは完全に同期しており、同期を必要としません。

populate フラグは、Emscripten の内部データとファイルシステムの永続データとの間の基盤となる同期の意図された方向を制御するために使用されます。

function myAppStartup(callback) {
  FS.mkdir('/data');
  FS.mount(IDBFS, {}, '/data');

  FS.syncfs(true, function (err) {
  // handle callback
  });
}

function myAppShutdown(callback) {
  FS.syncfs(function (err) {
  // handle callback
  });
}

この機能の実際の例は、test_idbfs_sync.c で確認できます。

引数
  • populate (bool) – Emscripten のファイルシステムデータをファイルシステムの永続ソースからのデータで初期化する場合は true、Emscripten のファイルシステムデータをファイルシステムの永続ソースに保存する場合は false

  • callback – 同期が完了したときに呼び出される通知コールバック関数。エラーが発生した場合、この関数のパラメータとして提供されます。

FS.mkdir(path, mode)

ファイルシステム内に新しいディレクトリノードを作成します。例えば

FS.mkdir('/data');

注意

基盤となる実装は、ユーザーまたはグループの権限をサポートしていません。呼び出し元は常にフォルダの所有者として扱われ、所有者に関連する権限のみが適用されます。

引数
  • path (string) – 新しいディレクトリノードのパス名。

  • mode (int) – 新しいノードのファイル権限。デフォルト設定(8進数表記)は0777です。

FS.mkdev(path, mode, dev)

dev に登録されたデバイスドライバ(FS.registerDevice())を参照する新しいデバイスノードをファイルシステム内に作成します。例えば

var id = FS.makedev(64, 0);
FS.registerDevice(id, {});
FS.mkdev('/dummy', id);
引数
  • path (string) – 新しいデバイスノードのパス名。

  • mode (int) –

    新しいノードのファイル権限。デフォルト設定(8進数表記)は0777です。

  • dev (int) – 登録済みのデバイスドライバ。

oldpathにリンクするシンボリックリンクノードをnewpathに作成します。例えば

FS.writeFile('file', 'foobar');
FS.symlink('file', 'link');
引数
  • oldpath (string) – リンク先のファイルのパス名。

  • newpath (string) – oldpathを指す新しいシンボリックリンクノードのパス。

FS.rename(oldpath, newpath)

oldpathにあるノードの名前をnewpathに変更します。例えば

FS.writeFile('file', 'foobar');
FS.rename('file', 'newfile');
引数
  • oldpath (string) – 古いパス名。

  • newpath (string) – 新しいパス名。

FS.rmdir(path)

pathにある空のディレクトリを削除します。

FS.mkdir('data');
FS.rmdir('data');
引数
  • path (string) – 削除するディレクトリのパス。

pathにあるノードへのリンクを解除します。

これにより、ファイルシステムから名前が削除されます。その名前がファイルへの最後のリンクであった場合(かつ、プロセスがファイルを開いていない場合)、ファイルは削除されます。

FS.writeFile('/foobar.txt', 'Hello, world');
FS.unlink('/foobar.txt');
引数
  • path (string) – ターゲットノードのパス。

pathにあるシンボリックリンクに格納されている文字列値を取得します。例えば

#include <stdio.h>
#include <emscripten.h>

int main() {
  MAIN_THREAD_EM_ASM(
  FS.writeFile('file', 'foobar');
  FS.symlink('file', 'link');
  console.log(FS.readlink('link'));
  );
  return 0;
}

出力

file
引数
  • path (string) – ターゲットファイルへのパス。

戻り値

pathにあるシンボリックリンクに格納されている文字列値。

FS.stat(path)

pathにあるノードに関する統計情報を含むJavaScriptオブジェクトを取得します。例えば

#include <stdio.h>
#include <emscripten.h>

int main() {
  MAIN_THREAD_EM_ASM(
  FS.writeFile('file', 'foobar');
  console.log(FS.stat('file'));
  );
  return 0;
}

出力

{
  dev: 1,
  ino: 13,
  mode: 33206,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  size: 6,
  atime: Mon Nov 25 2013 00:37:27 GMT-0800 (PST),
  mtime: Mon Nov 25 2013 00:37:27 GMT-0800 (PST),
  ctime: Mon Nov 25 2013 00:37:27 GMT-0800 (PST),
  blksize: 4096,
  blocks: 1
}
引数
  • path (string) – ターゲットファイルへのパス。

FS.lstat(path)

FS.stat() と同じです。ただし、path がシンボリックリンクの場合、返される統計情報は、リンク先のファイルではなく、リンク自体に関するものになります。

引数
  • path (string) – ターゲットファイルへのパス。

FS.chmod(path, mode)

path のモードフラグを mode に変更します。

注意

基盤となる実装は、ユーザーまたはグループの権限をサポートしていません。呼び出し元は常にフォルダの所有者として扱われ、所有者に関連する権限のみが適用されます。

FS.writeFile('forbidden', 'can\'t touch this');
FS.chmod('forbidden', 0000);
引数
FS.lchmod(path, mode)

FS.chmod() と同じです。ただし、path がシンボリックリンクの場合、モードはリンク先のファイルではなく、リンク自体に設定されます。

引数
FS.fchmod(fd, mode)

FS.chmod() と同じです。ただし、rawファイル記述子が fd として指定されます。

引数
FS.chown(path, uid, gid)

指定されたファイルの所有者を、指定されたユーザーまたはグループIDに変更します。

注意

この呼び出しは、移植されたコードに対して、より「完全な」APIマッピングを提供するために存在します。設定された値は事実上無視されます。

引数
  • path (string) – ターゲットファイルへのパス。

  • uid (int) – ファイルの所有者となるユーザーのID。

  • gid (int) – ファイルの所有者となるグループのID。

FS.lchown(path, uid, gid)

FS.chown() と同じです。ただし、path がシンボリックリンクの場合、プロパティはリンク先のファイルではなく、リンク自体に設定されます。

注意

この呼び出しは、移植されたコードに対して、より「完全な」APIマッピングを提供するために存在します。設定された値は事実上無視されます。

引数
  • path (string) – ターゲットファイルへのパス。

  • uid (int) – ファイルの所有者となるユーザーのID。

  • gid (int) – ファイルの所有者となるグループのID。

FS.fchown(fd, uid, gid)

FS.chown() と同じです。ただし、rawファイル記述子が fd として指定されます。

注意

この呼び出しは、移植されたコードに対して、より「完全な」APIマッピングを提供するために存在します。設定された値は事実上無視されます。

引数
  • fd (int) – ターゲットファイルの記述子。

  • uid (int) – ファイルの所有者となるユーザーのID。

  • gid (int) – ファイルの所有者となるグループのID。

FS.truncate(path, len)

ファイルを指定された長さに切り詰めます。例えば

#include <stdio.h>
#include <emscripten.h>

int main() {
  MAIN_THREAD_EM_ASM(
  FS.writeFile('file', 'foobar');
  FS.truncate('file', 3);
  console.log(FS.readFile('file', { encoding: 'utf8' }));
  );
  return 0;
}

出力

foo
引数
  • path (string) – 切り詰めるファイルのパス。

  • len (int) – ファイルの切り詰め長。

FS.ftruncate(fd, len)

fd によって識別されるファイルを、指定された長さ(len)に切り詰めます。

引数
  • fd (int) – 切り詰めるファイルの記述子。

  • len (int) – ファイルの切り詰め長。

FS.utime(path, atime, mtime)

path にあるファイルのタイムスタンプを変更します。引数に渡される時刻は、1970年1月1日(UTC/GMTの真夜中)からのミリ秒単位です。

現在の実装では、格納されるタイムスタンプは単一の値であり、atimemtime の最大値であることに注意してください。

引数
  • path (string) – 更新するファイルのパス。

  • atime (int) – ファイルアクセス時刻(ミリ秒)。

  • mtime (int) – ファイル変更時刻(ミリ秒)。

FS.open(path, flags[, mode])

指定されたフラグでファイルを開きます。flagsには以下のものを指定できます。

  • r — 読み取り用にファイルを開きます。

  • r+ — 読み取りと書き込み用にファイルを開きます。

  • w — 書き込み用にファイルを開きます。

  • wxwと同様ですが、パスが存在する場合は失敗します。

  • w+ — 読み取りと書き込み用にファイルを開きます。ファイルが存在しない場合は作成され、存在する場合は切り捨てられます。

  • wx+w+と同様ですが、パスが存在する場合は失敗します。

  • a — 追記用にファイルを開きます。ファイルが存在しない場合は作成されます。

  • axaと同様ですが、パスが存在する場合は失敗します。

  • a+ — 読み取りと追記用にファイルを開きます。ファイルが存在しない場合は作成されます。

  • ax+a+と同様ですが、パスが存在する場合は失敗します。

注意

基盤となる実装では、ユーザーまたはグループのアクセス許可はサポートされていません。modeで設定されたファイルアクセス許可は、ファイルが作成された場合にのみ使用されます。呼び出し元は常にファイルの所有者として扱われ、それらのアクセス許可のみが適用されます。

引数
  • path (string) – 開くファイルのパス。

  • flags (string) – 読み取りおよび書き込みのフラグ

  • mode

    ファイルアクセス許可のフラグ。デフォルト設定(8進数表記)は0666です。

戻り値

ストリームオブジェクト。

FS.close(stream)

ファイルストリームを閉じます。

引数
  • stream (object) – 閉じるストリーム。

FS.llseek(stream, offset, whence)

whenceパラメーターに応じて、ファイルの先頭、現在位置、または終端を基準として、ストリームのオフセットをoffsetバイト分だけ再配置します。

_llseek()関数は、ファイル記述子fdに関連付けられたオープンファイルのoffsetを、whenceがそれぞれSEEK_SETSEEK_CUR、またはSEEK_ENDであるかによって、ファイルの先頭、ファイル内の現在位置、またはファイルの終端を基準として、(offset_high<<32) | offset_lowバイト分だけ再配置します。結果として得られるファイル位置を引数resultで返します。

引数
  • stream (object) – オフセットを再配置するストリーム。

  • offset (int) – whenceを基準としたオフセット(バイト単位)。

  • whence (int) – オフセットを計算するファイル内の位置(先頭、現在位置、終端):SEEK_SET (0)、SEEK_CUR (1)、またはSEEK_END (2)

FS.read(stream, buffer, offset, length[, position])

ストリームからlengthバイト読み取り、bufferoffsetから格納します。

デフォルトでは、読み取りはストリームの現在のオフセットから開始されますが、position引数を使用して特定のオフセットを指定できます。例:

var stream = FS.open('abinaryfile', 'r');
var buf = new Uint8Array(4);
FS.read(stream, buf, 0, 4, 0);
FS.close(stream);
引数
  • stream (object) – 読み取り元のストリーム。

  • buffer (ArrayBufferView) – 読み取ったデータを格納するバッファ。

  • offset (int) – データを格納するbuffer内のオフセット。

  • length (int) – bufferに書き込むデータの長さ。

  • position (int) – 読み取るストリーム内のオフセット。デフォルトでは、ストリームの現在のオフセットです。

FS.write(stream, buffer, offset, length[, position])

bufferoffsetから始まるlengthバイトを書き込みます。

デフォルトでは、書き込みはストリームの現在のオフセットから開始されますが、position引数を使用して特定のオフセットを指定できます。例:

var data = new Uint8Array(32);
var stream = FS.open('dummy', 'w+');
FS.write(stream, data, 0, data.length, 0);
FS.close(stream);
引数
  • stream (object) – 書き込み先のストリーム。

  • buffer (ArrayBufferView) – 書き込むバッファ。

  • offset (int) – 書き込むbuffer内のオフセット。

  • length (int) – 書き込むデータの長さ。

  • position (int) – 書き込むストリーム内のオフセット。デフォルトでは、ストリームの現在のオフセットです。

FS.readFile(path, opts)

pathにあるファイル全体を読み取り、string(エンコードはutf8)として、または新しいUint8Arrayバッファ(エンコードはbinary)として返します。

引数
  • path (string) – 読み取るファイル。

  • opts (オブジェクト) –

    • encoding (string) – ファイルの内容を返すために使用されるエンコードを定義します:binary | utf8。デフォルトはbinaryです。

    • flags (string) – FS.open()で定義されている読み取りフラグ。デフォルトは'r'です。

戻り値

エンコーディングに応じて、ファイルはstringまたはUint8Arrayバッファとして返されます。

FS.writeFile(path, data, opts)

dataの内容全体をpathにあるファイルに書き込みます。例:

FS.writeFile('file', 'foobar');
var contents = FS.readFile('file', { encoding: 'utf8' });
引数
  • path (string) – dataを書き込むファイル。

  • data (string|ArrayBufferView) – 書き込むデータ。文字列は常にUTF-8としてデコードされます。

  • opts (オブジェクト) –

    • flags (string) – FS.open()で定義されている書き込みフラグ。デフォルトは'w'です。

FS.createLazyFile(parent, name, url, canRead, canWrite)

指定されたURLまたはローカルファイルシステムパスから、最初のアクセス時に遅延ロードされるファイルを作成し、その参照を返します。

警告

FirefoxとChromeは最近、同期バイナリXHRを無効にしたため、これは通常のHTMLページではJavaScriptでは機能しません(ただし、Web Worker内では機能します)。

FS.createLazyFile('/', 'foo', 'other/page.htm', true, false);
FS.createLazyFile('/', 'bar', '/get_file.php?name=baz', true, true);
引数
  • parent (string/object) – 親フォルダー。パス(例:'/usr/lib')または以前にFS.mkdir()またはFS.createPath()呼び出しから返されたオブジェクトのいずれか。

  • name (string) – 新しいファイルの名前。

  • url (文字列) – ブラウザでは、このファイルにアクセスしたときに内容が返されるURLです。node.jsのようなコマンドラインエンジンでは、内容はローカル(実)ファイルシステムパスから読み込まれます。このファイルへの書き込みは仮想であることに注意してください。

  • canRead (bool) – プログラムの視点から、ファイルに読み取り権限を設定する必要があるかどうか。

  • canWrite (bool) – プログラムの視点から、ファイルに書き込み権限を設定する必要があるかどうか。

戻り値

新しいファイルへの参照。

FS.createPreloadedFile(parent, name, url, canRead, canWrite)

ファイルを非同期でプリロードし、プリロードプラグインを使用してコンテンツを準備します。これをpreRunで呼び出す必要があります。run()は、すべてのプリロードされたファイルの準備ができるまで遅延されます。これは、preload-fileオプションがemcc--use-preload-pluginsが指定されている場合に機能する方法です(このメソッドを単独で使用する場合は、そのオプションでプログラムをビルドする必要があります)。

引数
  • parent (文字列/オブジェクト) – 親フォルダー。パス(例:'/usr/lib')またはFS.mkdir()またはFS.createPath()呼び出しから以前に返されたオブジェクトのいずれか。

  • name (string) – 新しいファイルの名前。

  • url (文字列) – ブラウザでは、このファイルにアクセスしたときに内容が返されるURLです。コマンドラインエンジンでは、内容はロードされるローカル(実)ファイルシステムパスになります。このファイルへの書き込みは仮想であることに注意してください。

  • canRead (bool) – プログラムの視点から、ファイルに読み取り権限を設定する必要があるかどうか。

  • canWrite (bool) – プログラムの視点から、ファイルに書き込み権限を設定する必要があるかどうか。

FS.trackingDelegate[callback name]

ユーザーは、異なるファイルシステムイベントを受信するコールバックを指定できます。これは、ファイルシステムの変更を追跡するのに役立ちます。これには-sFS_DEBUGが必要です。

  • willMovePath — パスが移動されようとしていることを示します。

  • onMovePath — パスが移動されたことを示します。

  • willDeletePath — パスが削除されようとしていることを示します。

  • onDeletePath — パスが削除されたことを示します。

  • onOpenFile — ファイルが開かれたことを示します。

  • onWriteToFile — ファイルへの書き込みが行われていることと、書き込まれたバイト数を示します。

  • onReadFile — ファイルの読み取りが行われていることと、読み取られたバイト数を示します。

  • onSeekFile — ファイル内でのシーク、位置、およびwhenceを示します。

  • onCloseFile — ファイルが閉じられていることを示します。

コールバック名

ファイルシステムイベントを示すコールバックの名前

サンプルコード

EM_ASM(
  FS.trackingDelegate['willMovePath'] = function(oldpath, newpath) {
    out('About to move "' + oldpath + '" to "' + newpath + '"');
  };
  FS.trackingDelegate['onMovePath'] = function(oldpath, newpath) {
    out('Moved "' + oldpath + '" to "' + newpath + '"');
  };
  FS.trackingDelegate['willDeletePath'] = function(path) {
    out('About to delete "' + path + '"');
  };
  FS.trackingDelegate['onDeletePath'] = function(path) {
    out('Deleted "' + path + '"');
  };
  FS.trackingDelegate['onOpenFile'] = function(path, flags) {
    out('Opened "' + path + '" with flags ' + flags);
  };
  FS.trackingDelegate['onReadFile'] = function(path, bytesRead) {
    out('Read ' + bytesRead + ' bytes from "' + path + '"');
  };
  FS.trackingDelegate['onWriteToFile'] = function(path, bytesWritten) {
    out('Wrote to file "' + path + '" with ' + bytesWritten + ' bytes written');
  };
  FS.trackingDelegate['onSeekFile'] = function(path, position, whence) {
    out('Seek on "' + path + '" with position ' + position + ' and whence ' + whence);
  };
  FS.trackingDelegate['onCloseFile'] = function(path) {
    out('Closed ' + path);
  };
  FS.trackingDelegate['onMakeDirectory'] = function(path, mode) {
    out('Created directory ' + path + ' with mode ' + mode);
  };
  FS.trackingDelegate['onMakeSymlink'] = function(oldpath, newpath) {
    out('Created symlink from ' + oldpath + ' to ' + newpath);
  };
);

FILE *file;
file = fopen("/test.txt", "w");
fputs("hello world", file);
fclose(file);
rename("/test.txt", "/renamed.txt");
file = fopen("/renamed.txt", "r");
char str[256] = {};
fgets(str, 255, file);
printf("File read returned '%s'\n", str);
fclose(file);
remove("/renamed.txt");
mkdir("/home/test", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
symlink("/renamed.txt", "/file.txt");

出力例

Opened "/test.txt" with flags O_CREAT O_TRUNC O_WRONLY and file size 0
Wrote to file "/test.txt" with 11 bytes written
Wrote to file "/test.txt" with 0 bytes written
Closed /test.txt
About to move "/test.txt" to "/renamed.txt"
Moved "/test.txt" to "/renamed.txt"
Opened "/renamed.txt" with flags O_RDONLY and file size 11
Read 0 bytes from "/renamed.txt"
Read 11 bytes from "/renamed.txt"
Read 0 bytes from "/renamed.txt"
Read 0 bytes from "/renamed.txt"
Wrote to file "/dev/tty" with 31 bytes written
File read returned 'hello world'
Wrote to file "/dev/tty" with 2 bytes written
Closed /renamed.txt
About to delete "/renamed.txt"
Deleted "/renamed.txt"
Created directory "/home/test" with mode 16893
Created symlink from "/renamed.txt" to "/file.txt"

ファイルの種類

Emscriptenのファイルシステムは、通常のファイル、ディレクトリ、シンボリックリンク、キャラクタデバイス、ブロックデバイス、およびソケットをサポートしています。ほとんどのUnixシステムと同様に、これらのすべてのファイルタイプは、FS.read()FS.write()のような高レベルのFS操作を使用して操作できます。

FS.isFile(mode)

modeビットマスクがファイルを表すかどうかをテストします。

引数
  • mode – ファイルの可能性のあるプロパティのビットマスク。

戻り値

modeビットマスクがファイルを表す場合はtrue

戻り値の型

bool

FS.isDir(mode)

modeビットマスクがディレクトリを表すかどうかをテストします。

戻り値

modeビットマスクがディレクトリを表す場合はtrue

戻り値の型

bool

modeビットマスクがシンボリックリンクを表すかどうかをテストします。

引数
  • mode – ファイルの可能性のあるプロパティのビットマスク。

戻り値

modeビットマスクがシンボリックリンクを表す場合はtrue

戻り値の型

bool

FS.isChrdev(mode)

modeビットマスクがキャラクタデバイスを表すかどうかをテストします。

引数
  • mode – ファイルの可能性のあるプロパティのビットマスク。

戻り値

modeビットマスクがキャラクタデバイスを表す場合はtrue

戻り値の型

bool

FS.isBlkdev(mode)

modeビットマスクがブロックデバイスを表すかどうかをテストします。

引数
  • mode – ファイルの可能性のあるプロパティのビットマスク。

戻り値

modeビットマスクがブロックデバイスを表す場合はtrue

戻り値の型

bool

FS.isSocket(mode)

modeビットマスクがソケットを表すかどうかをテストします。

引数
  • mode – ファイルの可能性のあるプロパティのビットマスク。

戻り値

modeビットマスクがソケットを表す場合はtrue

戻り値の型

bool

パス

FS.cwd()

現在の作業ディレクトリを取得します。

戻り値

現在の作業ディレクトリ。

FS.chdir(path)

現在の作業ディレクトリを設定します。

引数
  • path (文字列) – 現在の作業ディレクトリとして設定するパス。

FS.readdir(path)

pathの内容を読み取ります。

引数
  • path (文字列) – 入力パス。

戻り値

'.'および'..'を含む、ディレクトリ内のファイル名の配列。

FS.lookupPath(path, opts)

入力パスを検索し、解決されたパスとノードの両方を含むオブジェクトを返します。

オプション(opts)を使用すると、オブジェクト、その親コンポーネント、シンボリックリンク、またはシンボリックリンクが指すアイテムを返すかどうかを指定できます。例:

var lookup = FS.lookupPath(path, { parent: true });
引数
  • path (文字列) – 入力パス。

  • opts (オブジェクト) –

    パスのオプション

    • parent (bool) trueの場合、最後から2番目のコンポーネントに到達するとパスの解決を停止します。たとえば、{ parent: true }を持つパス/foo/barは、/fooを表すオブジェクトを返します。デフォルトはfalseです。

    • follow (bool) trueの場合、最後のコンポーネントがシンボリックリンクである場合はそれに従います。たとえば、/foo/notes.txtにリンクするシンボリックリンク/foo/symlinkを考えてみましょう。{ follow: true }の場合、/foo/notes.txtを表すオブジェクトが返されます。{ follow: false }の場合、シンボリックリンクファイルを表すオブジェクトが返されます。デフォルトはfalseです。

戻り値

次の形式のオブジェクト

{
  path: resolved_path,
  node: resolved_node
}

FS.analyzePath(path, dontResolveLastLink)

入力パスを検索し、ファイル統計とノードに関する情報を含むオブジェクトを返します。FS.lookupPathの上に構築され、指定されたパスとその親に関するより多くの情報を提供します。エラーが発生した場合でもスローされず、errorプロパティを返します。

引数
  • path (文字列) – 入力パス。

  • dontResolveLastLink (boolean) – trueの場合、最後のコンポーネントがシンボリックリンクであってもそれに従いません。

戻り値

次の形式のオブジェクト

{
  isRoot: boolean,
  exists: boolean,
  error: Error,
  name: string,
  path: resolved_path,
  object: resolved_node,
  parentExists: boolean,
  parentPath: resolved_parent_path,
  parentObject: resolved_parent_node
}

FS.getPath(node)

nodeへの絶対パスを、マウントを考慮して取得します。

引数
  • node – 現在のノード。

戻り値

nodeへの絶対パス。