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 は、既存の JavaScript バージョンを置き換える、Emscripten 用の高性能で完全にマルチスレッド化された WebAssembly ベースのファイルシステムレイヤーです。
JavaScript ベースのファイルシステムは、pthread がサポートされる前、および JS でコードを記述する方がより最適だったときに最初に記述されました。その結果、すべてのファイルシステム操作が行われるメインスレッドにプロキシする必要があるため、pthread ビルドではオーバーヘッドが発生します。WasmFS は、代わりに Wasm にコンパイルされ、完全にマルチスレッドをサポートしています。また、よりモジュール化され、拡張可能になることを目指しています。
元の 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) を使用して明示的に有効にする必要があります。
これは、ランタイムが初期化されたときに /
にマウントされるデフォルトのファイルシステムです。すべてのファイルは厳密にメモリ内に存在し、それらに書き込まれたデータはページがリロードされると失われます。
注意
このファイルシステムは、node.js 内で実行している場合にのみ使用されます。
このファイルシステムを使用すると、node 内のプログラムが、ホストファイルシステムのディレクトリ(マウント操作を介して)を Emscripten の仮想ファイルシステムのディレクトリにマップできます。node の同期 FS API を使用して、Emscripten ファイルシステムに書き込まれたデータをローカルディスクにすぐに永続化します。
例については、このテスト を参照してください。
注意
このファイルシステムは、node.js 内で実行している場合にのみ使用されます。
これは特別なバックエンドであり、通常のファイルシステムアクセスをすべて、FS.mount() を行う必要なく、直接 Node.js の操作に置き換えます。初期ワーキングディレクトリは、VFS ルートディレクトリではなく、process.cwd() と同じになります。このモードは、Node.js を直接使用して OS 上の実際のローカルファイルシステムにアクセスするため、コードは必ずしも OS 間で移植可能とは限りません。Node.js プログラムと同程度の移植性となり、これはつまり、基盤となる OS がアクセス許可やエラーなどをどのように処理するかの違いが顕著になる可能性があるということです。これまでのところ、主に Linux でテストされています。
この NODEFS に関するセクションをご覧ください。ここで、マウント操作を確認できます。これは NODERAWFS では不要です。
注意
このファイルシステムは、ブラウザ内でコードを実行する場合のみ使用します。
IDBFS ファイルシステムは、FS.syncfs()
インターフェースを実装しており、呼び出されると、すべての操作を IndexedDB
インスタンスに永続化します。
これは、ブラウザが永続ストレージのための同期 API を提供していないという制限を克服するために提供されており、そのため(デフォルトでは)すべての書き込みは一時的にメモリ内にのみ存在します。
IDBFS をマウントする際にマウントオプション autoPersist: true を渡すと、IDBFS ディレクトリツリーに変更が加えられるたびに、IndexedDB バックエンドに自動的に永続化されます。これにより、ユーザーは IDBFS マウントされたディレクトリツリーへの変更を永続化するために FS.syncfs を手動で呼び出す必要がなくなります。
注意
このファイルシステムは、ワーカー内でコードを実行する場合のみ使用します。
このファイルシステムは、ワーカー内の File
および Blob
オブジェクトへの読み取り専用アクセスを提供し、データ全体をメモリにコピーすることなく、潜在的に巨大なファイルに使用できます。
これにより、モジュールが別のモジュールのファイルシステムをマウントできます。これは、複数のモジュールがファイルの内容を手動で同期することなくファイルシステムを共有する必要がある場合に役立ちます。例:
// 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 操作がデバイスと透過的に対話できるようにします。
注意
すべてのデバイスは異なり、一意です。open
、close
、read
、および write
などの一般的なファイル操作は通常サポートされており(そして、相当する libc 関数を呼び出すための抽象化レイヤーを提供するためにファイルストリームによって継承されます)、各デバイスは、その固有の特性に基づいて必要なコールバックを実装する必要があります。
FS.
makedev
(ma, mi)¶メジャー番号とマイナー番号を単一の一意の整数に変換します。これは、デバイスを表す ID として使用されます。
ma – メジャー番号。
mi – マイナー番号。
FS.
registerDevice
(dev, ops)¶指定されたデバイスドライバをコールバックのセットで登録します。
dev – makedev()
を使用して作成された特定のデバイスドライバ ID。
ops (オブジェクト) – デバイスに必要なコールバックのセット。例については、NODEFS のデフォルトコールバックを参照してください。
Emscripten の標準 I/O は、仮想 /dev/stdin
、/dev/stdout
、および /dev/stderr
デバイスを経由して機能します。FS.init()
を呼び出すことで、独自の I/O 関数を使用してそれらをセットアップできます。
デフォルトでは
stdin
は、コマンドラインエンジンではターミナルから読み取り、ブラウザでは window.prompt()
を使用します(どちらの場合も、行バッファリング付き)。
stdout
は、そのような関数が定義されている場合は print
関数を使用し、コマンドラインエンジンではターミナルに、コンソールを持つブラウザではブラウザコンソールに出力します(これも行バッファリング付き)。
stderr
は stdout
と同じ出力関数を使用します。
注意
すべての設定は、メインの run()
メソッドが実行される前に行う必要があり、通常は Module.preRun
を実装することによって行います。詳細については、コードとのインタラクションを参照してください。
FS.
init
(input, output, error)¶stdin
、stdout
、および stderr
の標準 I/O デバイスをセットアップします。
デバイスは、次の(オプションの)コールバックを使用してセットアップされます。コールバックのいずれかが例外をスローした場合、デバイスが故障した場合と同じようにキャッチされて処理されます。
input – 入力コールバック。プログラムが stdin
から読み取ろうとするたびに、パラメータなしで呼び出されます。データが利用可能な場合は ASCII 文字コードを返し、利用可能でない場合は null
を返す必要があります。
output – 出力コールバック。プログラムが stdout
に書き込むたびに、ASCII 文字コードで呼び出されます。出力をフラッシュするために null
で呼び出すこともできます。
error – エラーコールバック。これは output
に似ていますが、データが stderr
に書き込まれるときに呼び出される点が異なります。
注意
FS.readdir()
のように libc から派生した関数はすべて小文字の名前を使用しますが、FS.readFile()
のように追加された関数はキャメルケースの名前を使用します。
FS.
mount
(type, opts, mountpoint)¶type
で指定された FS オブジェクトを mountpoint
で指定されたディレクトリにマウントします。opts
オブジェクトは、ファイルシステムタイプごとに固有です。
type – ファイルシステムタイプ:MEMFS
、NODEFS
、IDBFS
、または WORKERFS
。
opts (オブジェクト) –
基盤となるファイルシステムで使用される汎用設定オブジェクト。
NODEFS
は root パラメータを使用して、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');
注意
基盤となる実装は、ユーザーまたはグループの権限をサポートしていません。呼び出し元は常にフォルダの所有者として扱われ、所有者に関連する権限のみが適用されます。
FS.
mkdev
(path, mode, dev)¶dev
に登録されたデバイスドライバ(FS.registerDevice()
)を参照する新しいデバイスノードをファイルシステム内に作成します。例えば
var id = FS.makedev(64, 0);
FS.registerDevice(id, {});
FS.mkdev('/dummy', id);
FS.
symlink
(oldpath, newpath)¶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) – 削除するディレクトリのパス。
FS.
unlink
(path)¶path
にあるノードへのリンクを解除します。
これにより、ファイルシステムから名前が削除されます。その名前がファイルへの最後のリンクであった場合(かつ、プロセスがファイルを開いていない場合)、ファイルは削除されます。
例
FS.writeFile('/foobar.txt', 'Hello, world');
FS.unlink('/foobar.txt');
path (string) – ターゲットノードのパス。
FS.
readlink
(path)¶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の真夜中)からのミリ秒単位です。
現在の実装では、格納されるタイムスタンプは単一の値であり、atime
と mtime
の最大値であることに注意してください。
path (string) – 更新するファイルのパス。
atime (int) – ファイルアクセス時刻(ミリ秒)。
mtime (int) – ファイル変更時刻(ミリ秒)。
FS.
open
(path, flags[, mode])¶指定されたフラグでファイルを開きます。flags
には以下のものを指定できます。
r
— 読み取り用にファイルを開きます。
r+
— 読み取りと書き込み用にファイルを開きます。
w
— 書き込み用にファイルを開きます。
wx
— w
と同様ですが、パスが存在する場合は失敗します。
w+
— 読み取りと書き込み用にファイルを開きます。ファイルが存在しない場合は作成され、存在する場合は切り捨てられます。
wx+
— w+
と同様ですが、パスが存在する場合は失敗します。
a
— 追記用にファイルを開きます。ファイルが存在しない場合は作成されます。
ax
— a
と同様ですが、パスが存在する場合は失敗します。
a+
— 読み取りと追記用にファイルを開きます。ファイルが存在しない場合は作成されます。
ax+
— a+
と同様ですが、パスが存在する場合は失敗します。
注意
基盤となる実装では、ユーザーまたはグループのアクセス許可はサポートされていません。mode
で設定されたファイルアクセス許可は、ファイルが作成された場合にのみ使用されます。呼び出し元は常にファイルの所有者として扱われ、それらのアクセス許可のみが適用されます。
FS.
close
(stream)¶ファイルストリームを閉じます。
stream (object) – 閉じるストリーム。
FS.
llseek
(stream, offset, whence)¶whence
パラメーターに応じて、ファイルの先頭、現在位置、または終端を基準として、ストリームのオフセットをoffset
バイト分だけ再配置します。
_llseek()
関数は、ファイル記述子fd
に関連付けられたオープンファイルのoffset
を、whence
がそれぞれSEEK_SET
、SEEK_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
バイト読み取り、buffer
のoffset
から格納します。
デフォルトでは、読み取りはストリームの現在のオフセットから開始されますが、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])¶buffer
のoffset
から始まる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
FS.
isLink
(mode)¶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
への絶対パス。