ファイルシステム操作¶
libuvは、プラットフォーム間で使える多様な同期・非同期のファイルシステム操作を提供します。この文書のすべての関数はコールバックを受け取り、NULLも指定できます。コールバックがNULLなら要求を同期的に完了し、それ以外なら非同期的に実行します。
すべてのファイル操作はスレッドプール上で実行します。スレッドプールのサイズについては、スレッドプールの作業スケジューリングを参照してください。
libuv v1.45.0以降、Linuxの一部のファイル操作は、可能な場合、io_uring <https://en.wikipedia.org/wiki/Io_uring>へ委譲します。スループットが(場合によっては大幅に)向上する以外、観察できる動作は変わらないはずです。必要なカーネル機能が利用できない場合や適していない場合は、スレッドプールへ戻します。libuv v1.49.0以降、この動作を元に戻し、Linuxでも再びデフォルトでスレッドプールを使います。io_uringを有効にするには、uv_loop_tのインスタンスを、UV_LOOP_USE_IO_URING_SQPOLLオプションで設定する必要があります。
注記
Windowsでは、uv_fs_*関数はUTF-8エンコーディングを使います。
データ型¶
-
type uv_fs_t¶
ファイルシステム要求の型です。
-
type uv_timespec_t¶
ナノ秒分解能の時刻を格納する、2038年問題に対応していないデータ型です。libuv v2.0では、
uv_timespec64_tに置き換えます。typedef struct { long tv_sec; long tv_nsec; } uv_timespec_t;
-
type uv_stat_t¶
次の構造体に相当する、可搬な型です:
struct stat。typedef struct { uint64_t st_dev; uint64_t st_mode; uint64_t st_nlink; uint64_t st_uid; uint64_t st_gid; uint64_t st_rdev; uint64_t st_ino; uint64_t st_size; uint64_t st_blksize; uint64_t st_blocks; uint64_t st_flags; uint64_t st_gen; uv_timespec_t st_atim; uv_timespec_t st_mtim; uv_timespec_t st_ctim; uv_timespec_t st_birthtim; } uv_stat_t;
-
enum uv_fs_type¶
ファイルシステム要求の型です。
typedef enum { UV_FS_UNKNOWN = -1, UV_FS_CUSTOM, UV_FS_OPEN, UV_FS_CLOSE, UV_FS_READ, UV_FS_WRITE, UV_FS_SENDFILE, UV_FS_STAT, UV_FS_LSTAT, UV_FS_FSTAT, UV_FS_FTRUNCATE, UV_FS_UTIME, UV_FS_FUTIME, UV_FS_ACCESS, UV_FS_CHMOD, UV_FS_FCHMOD, UV_FS_FSYNC, UV_FS_FDATASYNC, UV_FS_UNLINK, UV_FS_RMDIR, UV_FS_MKDIR, UV_FS_MKDTEMP, UV_FS_RENAME, UV_FS_SCANDIR, UV_FS_LINK, UV_FS_SYMLINK, UV_FS_READLINK, UV_FS_CHOWN, UV_FS_FCHOWN, UV_FS_REALPATH, UV_FS_COPYFILE, UV_FS_LCHOWN, UV_FS_OPENDIR, UV_FS_READDIR, UV_FS_CLOSEDIR, UV_FS_MKSTEMP, UV_FS_LUTIME } uv_fs_type;
-
type uv_statfs_t¶
次の構造体に相当する、プラットフォーム間で使える簡略化した型です:
struct statfs。次の関数で使います:uv_fs_statfs()。typedef struct uv_statfs_s { uint64_t f_type; uint64_t f_bsize; uint64_t f_blocks; uint64_t f_bfree; uint64_t f_bavail; uint64_t f_files; uint64_t f_ffree; uint64_t f_frsize; uint64_t f_spare[3]; } uv_statfs_t;
-
enum uv_dirent_type_t¶
ディレクトリーエントリーの型です。
typedef enum { UV_DIRENT_UNKNOWN, UV_DIRENT_FILE, UV_DIRENT_DIR, UV_DIRENT_LINK, UV_DIRENT_FIFO, UV_DIRENT_SOCKET, UV_DIRENT_CHAR, UV_DIRENT_BLOCK } uv_dirent_type_t;
-
type uv_dirent_t¶
次の構造体に相当する、プラットフォーム間で使える簡略化した型です:
struct dirent。次の関数で使います:uv_fs_scandir_next()。typedef struct uv_dirent_s { const char* name; uv_dirent_type_t type; } uv_dirent_t;
-
type uv_dir_t¶
ディレクトリーをストリームとして反復処理するためのデータ型です。次の関数で使います:
uv_fs_opendir()、uv_fs_readdir()およびuv_fs_closedir()。direntsは、結果を格納するためにユーザーが用意する、uv_dirent_t`sの配列を表します。`nentriesは、ユーザーが指定する、dirents配列の最大サイズです。typedef struct uv_dir_s { uv_dirent_t* dirents; size_t nentries; } uv_dir_t;
公開メンバー¶
-
uv_fs_type uv_fs_t.fs_type¶
ファイルシステム要求の型です。
-
ssize_t uv_fs_t.result¶
要求の結果です。0未満ならエラー、それ以外なら成功です。次の関数のような要求では、
uv_fs_read()またはuv_fs_write()、それぞれ読み書きしたデータ量を示します。
-
uv_stat_t uv_fs_t.statbuf¶
次の関数、
uv_fs_stat()やその他のstat要求の結果を格納します。
-
void *uv_fs_t.ptr¶
次の関数、
uv_fs_readlink()とuv_fs_realpath()の結果を格納し、statbufの別名としても使います。
関連項目
次の型のuv_req_tメンバーも適用されます。
API¶
-
int uv_fs_open(uv_loop_t *loop, uv_fs_t *req, const char *path, int flags, int mode, uv_fs_cb cb)¶
次の関数と同等です: open(2)。
注記
Windowsでは、libuvはCreateFileWを使うため、常にバイナリーモードでファイルを開きます。このため、O_BINARYとO_TEXTフラグはサポートしていません。
-
int uv_fs_read(uv_loop_t *loop, uv_fs_t *req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb)¶
preadv(2)と同等です。offset引数が-1なら、現在のファイルオフセットを使い、更新します。
警告
WindowsでMSVC以外の環境(GCCやClangでlibuvをビルドする場合など)では、
UV_FS_O_FILEMAPで開いたファイルのメモリーマップ読み取り操作に失敗すると、致命的なクラッシュが起きる場合があります。
-
int uv_fs_unlink(uv_loop_t *loop, uv_fs_t *req, const char *path, uv_fs_cb cb)¶
次の関数と同等です: unlink(2)。
-
int uv_fs_write(uv_loop_t *loop, uv_fs_t *req, uv_file file, const uv_buf_t bufs[], unsigned int nbufs, int64_t offset, uv_fs_cb cb)¶
pwritev(2)と同等です。offset引数が-1なら、現在のファイルオフセットを使い、更新します。
警告
WindowsでMSVC以外の環境(GCCやClangでlibuvをビルドする場合など)では、
UV_FS_O_FILEMAPで開いたファイルのメモリーマップ書き込み操作に失敗すると、致命的なクラッシュが起きる場合があります。
-
int uv_fs_mkdir(uv_loop_t *loop, uv_fs_t *req, const char *path, int mode, uv_fs_cb cb)¶
次の関数と同等です: mkdir(2)。
注記
modeは、現在、Windowsでは実装していません。
-
int uv_fs_mkdtemp(uv_loop_t *loop, uv_fs_t *req, const char *tpl, uv_fs_cb cb)¶
mkdtemp(3)と同等です。結果は、次のフィールドのヌル終端文字列として取得できます: req->path。
-
int uv_fs_mkstemp(uv_loop_t *loop, uv_fs_t *req, const char *tpl, uv_fs_cb cb)¶
mkstemp(3)と同等です。作成したファイルのパスは、次のフィールドのヌル終端文字列として取得できます: req->path。ファイルディスクリプターは、次のフィールドの整数値として取得できます: req->result。
バージョン1.34.0で追加。
-
int uv_fs_opendir(uv_loop_t *loop, uv_fs_t *req, const char *path, uv_fs_cb cb)¶
次のパス、pathをディレクトリーストリームとして開きます。成功時は、uv_dir_tを確保し、req->ptr経由で返します。このメモリーは、uv_fs_req_cleanup()では解放しません。ただし、req->ptrはNULLに設定されます。確保したメモリーは、uv_fs_closedir()を呼び出して解放する必要があります。失敗時はメモリーを確保しません。
取得したuv_dir_tをuv_fs_readdir()へ渡すと、ディレクトリーの内容を反復処理できます。
バージョン1.28.0で追加。
-
int uv_fs_closedir(uv_loop_t *loop, uv_fs_t *req, uv_dir_t *dir, uv_fs_cb cb)¶
次の値で表すディレクトリーストリーム、dirを閉じ、uv_fs_opendir()が確保したメモリーを解放します。
バージョン1.28.0で追加。
-
int uv_fs_readdir(uv_loop_t *loop, uv_fs_t *req, uv_dir_t *dir, uv_fs_cb cb)¶
次のディレクトリーストリーム、dirを反復処理します。これはuv_fs_opendir()の成功時に返したものです。uv_fs_readdir()を呼び出す前に、呼び出し元はdir->direntsとdir->nentriesを設定する必要があります。これらは、読み取ったディレクトリーエントリーを格納する、
uv_dirent_t要素の配列と、そのサイズを表します。成功時の結果は、ストリームから読み取ったエントリー数を表す0以上の整数です。
バージョン1.28.0で追加。
警告
uv_fs_readdir()はスレッドセーフではありません。
注記
この関数は「.」と「..」のエントリーを返しません。
注記
成功時、この関数はメモリーを確保します。次の関数で解放する必要があります: uv_fs_req_cleanup()。uv_fs_req_cleanup()は、uv_fs_closedir()でディレクトリーを閉じる前に呼び出してください。
-
int uv_fs_scandir_next(uv_fs_t *req, uv_dirent_t *ent)¶
scandir(3)と同等ですが、APIは少し異なります。要求のコールバックを呼び出した後、ユーザーは
uv_fs_scandir_next()を使い、entに次のディレクトリーエントリーのデータを格納できます。エントリーがなくなると、UV_EOFを返します。注記
次の関数、scandir(3)と異なり、この関数は「.」と「..」のエントリーを返しません。
注記
Linuxでエントリーの型を取得できるのは、一部のファイルシステムだけです(執筆時点ではbtrfs、ext2、ext3、ext4)。次のmanページを確認してください: getdents(2)。
-
int uv_fs_statfs(uv_loop_t *loop, uv_fs_t *req, const char *path, uv_fs_cb cb)¶
statfs(2)と同等です。成功時は、uv_statfs_tを確保し、req->ptr経由で返します。このメモリーは、uv_fs_req_cleanup()で解放します。
注記
結果のuv_statfs_tで、基盤となるOSがサポートしていないフィールドは0に設定されます。
バージョン1.31.0で追加。
-
int uv_fs_rename(uv_loop_t *loop, uv_fs_t *req, const char *path, const char *new_path, uv_fs_cb cb)¶
次の関数と同等です: rename(2)。
-
int uv_fs_fsync(uv_loop_t *loop, uv_fs_t *req, uv_file file, uv_fs_cb cb)¶
次の関数と同等です: fsync(2)。
注記
AIXでは、uv_fs_fsyncは、通常ファイル以外を参照するファイルディスクリプターに対して、UV_EBADFを返します。
-
int uv_fs_fdatasync(uv_loop_t *loop, uv_fs_t *req, uv_file file, uv_fs_cb cb)¶
次の関数と同等です: fdatasync(2)。
-
int uv_fs_ftruncate(uv_loop_t *loop, uv_fs_t *req, uv_file file, int64_t offset, uv_fs_cb cb)¶
次の関数と同等です: ftruncate(2)。
-
int uv_fs_copyfile(uv_loop_t *loop, uv_fs_t *req, const char *path, const char *new_path, int flags, uv_fs_cb cb)¶
次のパス、pathからnew_pathへファイルをコピーします。サポートするflagsは次のとおりです。
UV_FS_COPYFILE_EXCL: 指定すると、uv_fs_copyfile()は、宛先パスがすでに存在する場合、UV_EEXISTで失敗します。デフォルトでは、存在する宛先を上書きします。
UV_FS_COPYFILE_FICLONE: 指定すると、uv_fs_copyfile()はコピーオンライトのreflinkの作成を試みます。基盤となるプラットフォームがコピーオンライトをサポートしていない場合や、その使用中にエラーが起きた場合は、
uv_fs_sendfile()を使うコピー方式へフォールバックします。UV_FS_COPYFILE_FICLONE_FORCE: 指定すると、uv_fs_copyfile()はコピーオンライトのreflinkの作成を試みます。基盤となるプラットフォームがコピーオンライトをサポートしていない場合や、その使用中にエラーが起きた場合は、エラーを返します。
警告
宛先パスを作成した後、データのコピー中にエラーが起きると、宛先パスを削除します。ファイルを閉じてから削除するまでの短い間に、別のプロセスがファイルへアクセスする場合があります。
バージョン1.14.0で追加。
バージョン1.20.0での変更: UV_FS_COPYFILE_FICLONEとUV_FS_COPYFILE_FICLONE_FORCEをサポートしました。
バージョン1.33.0での変更: 次のフラグ、UV_FS_COPYFILE_FICLONE_FORCEの使用中にエラーが起きると、そのエラーを返します。以前は、すべてのエラーをUV_ENOTSUPへ対応付けていました。
-
int uv_fs_sendfile(uv_loop_t *loop, uv_fs_t *req, uv_file out_fd, uv_file in_fd, int64_t in_offset, size_t length, uv_fs_cb cb)¶
次の関数と同等ですが、機能には制限があります: sendfile(2)。
-
int uv_fs_access(uv_loop_t *loop, uv_fs_t *req, const char *path, int mode, uv_fs_cb cb)¶
access(2)とUnix上で同等です。Windowsでは
GetFileAttributesW()を使います。
-
int uv_fs_utime(uv_loop_t *loop, uv_fs_t *req, const char *path, double atime, double mtime, uv_fs_cb cb)¶
-
int uv_fs_futime(uv_loop_t *loop, uv_fs_t *req, uv_file file, double atime, double mtime, uv_fs_cb cb)¶
-
int uv_fs_lutime(uv_loop_t *loop, uv_fs_t *req, const char *path, double atime, double mtime, uv_fs_cb cb)¶
utime(2), futimes(3)およびlutimes(3)と、それぞれ同等です。
次の値、UV_FS_UTIME_NOWをatimeまたはmtimeに渡すと、タイムスタンプを現在時刻に設定します。
次の値、UV_FS_UTIME_OMITをatimeまたはmtimeに渡すと、タイムスタンプを変更しません。
注記
z/OS: uv_fs_lutime()はz/OSには実装していません。呼び出すことはできますが、
UV_ENOSYSを返します。注記
AIX: uv_fs_futime()とuv_fs_lutime()はAIX 7.1以降だけで動作します。それ以前でも呼び出せますが、
UV_ENOSYSを返します。バージョン1.10.0での変更: Windowsで秒未満の精度をサポートしました。
-
int uv_fs_link(uv_loop_t *loop, uv_fs_t *req, const char *path, const char *new_path, uv_fs_cb cb)¶
次の関数と同等です: link(2)。
-
int uv_fs_symlink(uv_loop_t *loop, uv_fs_t *req, const char *path, const char *new_path, int flags, uv_fs_cb cb)¶
次の関数と同等です: symlink(2)。
注記
Windowsでは、flagsパラメーターで、シンボリックリンクの作成方法を制御できます:
UV_FS_SYMLINK_DIR: pathがディレクトリーを指すことを示します。UV_FS_SYMLINK_JUNCTION: ジャンクションポイントを使ったシンボリックリンクの作成を要求します。
-
int uv_fs_readlink(uv_loop_t *loop, uv_fs_t *req, const char *path, uv_fs_cb cb)¶
readlink(2)と同等です。結果の文字列をreq->ptrに格納します。
-
int uv_fs_realpath(uv_loop_t *loop, uv_fs_t *req, const char *path, uv_fs_cb cb)¶
realpath(3)とUnix上で同等です。WindowsではGetFinalPathNameByHandleWを使います。結果の文字列をreq->ptrに格納します。
警告
この関数には、Nodeで使った際に見つかった、プラットフォーム固有の注意事項があります。
macOSおよびその他のBSD: 指定したパスの解決中に32個を超えるシンボリックリンクが見つかると、UV_ELOOPで失敗します。この上限は固定で、回避できません。
Windows: 一般的な場合には動作しますが、次のような例外的な状況では動作しません:
ボリュームマネージャーを迂回するツール(ImDiskなど)が作成したRAMディスクボリューム内のパスは解決できません。
ドライブ文字の大文字・小文字の扱いが一貫していません。
解決したパスは、substで割り当てたドライブを迂回します。
この関数は引き続き使えますが、上記のような状況をサポートする必要がある場合は推奨しません。
これらの問題の背景や詳細は、こちらで確認できます。
バージョン1.8.0で追加。
-
int uv_fs_chown(uv_loop_t *loop, uv_fs_t *req, const char *path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb)¶
-
int uv_fs_fchown(uv_loop_t *loop, uv_fs_t *req, uv_file file, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb)¶
-
int uv_fs_lchown(uv_loop_t *loop, uv_fs_t *req, const char *path, uv_uid_t uid, uv_gid_t gid, uv_fs_cb cb)¶
chown(2), fchown(2)およびlchown(2)と、それぞれ同等です。
注記
これらの関数はWindowsには実装していません。
バージョン1.21.0での変更: uv_fs_lchownを実装しました。
-
uv_fs_type uv_fs_get_type(const uv_fs_t *req)¶
次の値を返します: req->fs_type。
バージョン1.19.0で追加。
-
int uv_fs_get_system_error(const uv_fs_t *req)¶
プラットフォーム固有のエラーコードを返します。WindowsではGetLastError()の値、その他のプラットフォームでは-(req->result)です。
バージョン1.38.0で追加。
関連項目
次の型のuv_req_tAPI関数も適用されます。
補助関数¶
-
uv_os_fd_t uv_get_osfhandle(int fd)¶
Cランタイムのファイルディスクリプターから、OS固有のハンドルを取得します。Unixでは、
fdをそのまま返します。Windowsでは、_get_osfhandleを呼び出します。返す値の所有権は引き続きCランタイムにあり、その値を閉じようとしたり、fdを閉じた後に使ったりすると、不具合につながる場合があります。バージョン1.12.0で追加。
-
int uv_open_osfhandle(uv_os_fd_t os_fd)¶
OS固有のハンドルから、Cランタイムのファイルディスクリプターを取得します。Unixでは、
os_fdをそのまま返します。Windowsでは、_open_osfhandleを呼び出します。この処理は引数を消費します。その引数を閉じようとしたり、返したファイルディスクリプターを閉じた後に使ったりすると、不具合につながる場合があります。バージョン1.23.0で追加。
ファイルを開くための定数¶
-
UV_FS_O_APPEND¶
追記モードでファイルを開きます。書き込みのたびに、ファイルオフセットをファイル末尾へ移動します。
-
UV_FS_O_CREAT¶
ファイルが存在しなければ作成します。
-
UV_FS_O_DIRECT¶
ユーザー空間のバッファとの間でファイルI/Oを直接行います。バッファはアラインメントを合わせる必要があります。バッファのサイズとアドレスは、ブロックデバイスの物理セクターサイズの倍数にしてください。
注記
UV_FS_O_DIRECTはLinuxでサポートし、WindowsではFILE_FLAG_NO_BUFFERINGを介してサポートします。UV_FS_O_DIRECTはmacOSではサポートしていません。
-
UV_FS_O_DIRECTORY¶
パスがディレクトリーでなければ、オープンに失敗します。
注記
UV_FS_O_DIRECTORYはWindowsではサポートしていません。
-
UV_FS_O_DSYNC¶
同期I/O用にファイルを開きます。すべてのデータと最小限のメタデータをディスクへ書き出した時点で、書き込み操作を完了します。
注記
UV_FS_O_DSYNCはWindowsで、FILE_FLAG_WRITE_THROUGHを介してサポートします。
-
UV_FS_O_EXCL¶
次のフラグ、O_CREATを設定していてファイルがすでに存在する場合、オープンに失敗します。
注記
一般に、O_EXCLをO_CREATなしで使った場合の動作は未定義です。例外として、Linux 2.6以降では、パスがブロックデバイスを指している場合、O_EXCLをO_CREATなしで使えます。ブロックデバイスがシステムで使用中(マウント済みなど)なら、次のエラーでオープンに失敗します: EBUSY。
-
UV_FS_O_EXLOCK¶
排他的ロックをアトミックに取得します。
注記
UV_FS_O_EXLOCKはmacOSとWindowsだけでサポートしています。
バージョン1.17.0での変更: Windowsのサポートを追加しました。
-
UV_FS_O_FILEMAP¶
メモリーファイルマッピングを使ってファイルにアクセスします。このフラグを使う場合、同じファイルを同時に複数回開くことはできません。
注記
UV_FS_O_FILEMAPはWindowsだけでサポートしています。
-
UV_FS_O_NOATIME¶
ファイルを読み取る際、アクセス時刻を更新しません。
注記
UV_FS_O_NOATIMEはWindowsではサポートしていません。
-
UV_FS_O_NOCTTY¶
パスが端末デバイスを指している場合、そのパスを開いても、その端末がプロセスの制御端末になることはありません(プロセスに制御端末がまだない場合)。
注記
UV_FS_O_NOCTTYはWindowsではサポートしていません。
-
UV_FS_O_NOFOLLOW¶
パスがシンボリックリンクなら、オープンに失敗します。
注記
UV_FS_O_NOFOLLOWはWindowsではサポートしていません。
-
UV_FS_O_NONBLOCK¶
可能なら、非ブロッキングモードでファイルを開きます。
注記
UV_FS_O_NONBLOCKはWindowsではサポートしていません。
-
UV_FS_O_RANDOM¶
ランダムアクセスを想定しています。システムはこれを、ファイルキャッシュを最適化するためのヒントとして使えます。
注記
UV_FS_O_RANDOMはWindowsだけで、FILE_FLAG_RANDOM_ACCESSを介してサポートしています。
-
UV_FS_O_RDONLY¶
読み取り専用でファイルを開きます。
-
UV_FS_O_RDWR¶
読み書き用にファイルを開きます。
-
UV_FS_O_SEQUENTIAL¶
先頭から末尾へのシーケンシャルアクセスを想定しています。システムはこれを、ファイルキャッシュを最適化するためのヒントとして使えます。
注記
UV_FS_O_SEQUENTIALはWindowsだけで、FILE_FLAG_SEQUENTIAL_SCANを介してサポートしています。
-
UV_FS_O_SHORT_LIVED¶
一時ファイルです。可能なら、ディスクへ書き出さないでください。
注記
UV_FS_O_SHORT_LIVEDはWindowsだけで、FILE_ATTRIBUTE_TEMPORARYを介してサポートしています。
-
UV_FS_O_SYMLINK¶
リンク先のリソースではなく、シンボリックリンク自体を開きます。
-
UV_FS_O_SYNC¶
同期I/O用にファイルを開きます。すべてのデータとすべてのメタデータをディスクへ書き出した時点で、書き込み操作を完了します。
注記
UV_FS_O_SYNCはWindowsで、FILE_FLAG_WRITE_THROUGHを介してサポートしています。
-
UV_FS_O_TEMPORARY¶
一時ファイルです。可能なら、ディスクへ書き出さないでください。
注記
UV_FS_O_TEMPORARYはWindowsだけで、FILE_ATTRIBUTE_TEMPORARYを介してサポートしています。
-
UV_FS_O_TRUNC¶
ファイルが存在して通常ファイルであり、書き込み用に正常に開いた場合、長さを0に切り詰めます。
-
UV_FS_O_WRONLY¶
書き込み専用でファイルを開きます。