|
160
|
1
|
|
|
2 .. _fs:
|
|
|
3
|
|
|
4 File system operations
|
|
|
5 ======================
|
|
|
6
|
|
|
7 libuv provides a wide variety of cross-platform sync and async file system
|
|
|
8 operations. All functions defined in this document take a callback, which is
|
|
|
9 allowed to be NULL. If the callback is NULL the request is completed synchronously,
|
|
|
10 otherwise it will be performed asynchronously.
|
|
|
11
|
|
|
12 All file operations are run on the threadpool. See :ref:`threadpool` for information
|
|
|
13 on the threadpool size.
|
|
|
14
|
|
|
15 Starting with libuv v1.45.0, some file operations on Linux are handed off to
|
|
|
16 `io_uring <https://en.wikipedia.org/wiki/Io_uring>` when possible. Apart from
|
|
|
17 a (sometimes significant) increase in throughput there should be no change in
|
|
|
18 observable behavior. Libuv reverts to using its threadpool when the necessary
|
|
|
19 kernel features are unavailable or unsuitable. Starting with libuv v1.49.0 this
|
|
|
20 behavior was reverted and Libuv on Linux by default will be using the threadpool
|
|
|
21 again. In order to enable io_uring the :c:type:`uv_loop_t` instance must be
|
|
|
22 configured with the :c:type:`UV_LOOP_ENABLE_IO_URING_SQPOLL` option.
|
|
|
23
|
|
|
24 .. note::
|
|
|
25 On Windows `uv_fs_*` functions use utf-8 encoding.
|
|
|
26
|
|
|
27 Data types
|
|
|
28 ----------
|
|
|
29
|
|
|
30 .. c:type:: uv_fs_t
|
|
|
31
|
|
|
32 File system request type.
|
|
|
33
|
|
|
34 .. c:type:: uv_timespec_t
|
|
|
35
|
|
|
36 Y2K38-unsafe data type for storing times with nanosecond resolution.
|
|
|
37 Will be replaced with :c:type:`uv_timespec64_t` in libuv v2.0.
|
|
|
38
|
|
|
39 ::
|
|
|
40
|
|
|
41 typedef struct {
|
|
|
42 long tv_sec;
|
|
|
43 long tv_nsec;
|
|
|
44 } uv_timespec_t;
|
|
|
45
|
|
|
46 .. c:type:: uv_stat_t
|
|
|
47
|
|
|
48 Portable equivalent of ``struct stat``.
|
|
|
49
|
|
|
50 ::
|
|
|
51
|
|
|
52 typedef struct {
|
|
|
53 uint64_t st_dev;
|
|
|
54 uint64_t st_mode;
|
|
|
55 uint64_t st_nlink;
|
|
|
56 uint64_t st_uid;
|
|
|
57 uint64_t st_gid;
|
|
|
58 uint64_t st_rdev;
|
|
|
59 uint64_t st_ino;
|
|
|
60 uint64_t st_size;
|
|
|
61 uint64_t st_blksize;
|
|
|
62 uint64_t st_blocks;
|
|
|
63 uint64_t st_flags;
|
|
|
64 uint64_t st_gen;
|
|
|
65 uv_timespec_t st_atim;
|
|
|
66 uv_timespec_t st_mtim;
|
|
|
67 uv_timespec_t st_ctim;
|
|
|
68 uv_timespec_t st_birthtim;
|
|
|
69 } uv_stat_t;
|
|
|
70
|
|
|
71 .. c:enum:: uv_fs_type
|
|
|
72
|
|
|
73 File system request type.
|
|
|
74
|
|
|
75 ::
|
|
|
76
|
|
|
77 typedef enum {
|
|
|
78 UV_FS_UNKNOWN = -1,
|
|
|
79 UV_FS_CUSTOM,
|
|
|
80 UV_FS_OPEN,
|
|
|
81 UV_FS_CLOSE,
|
|
|
82 UV_FS_READ,
|
|
|
83 UV_FS_WRITE,
|
|
|
84 UV_FS_SENDFILE,
|
|
|
85 UV_FS_STAT,
|
|
|
86 UV_FS_LSTAT,
|
|
|
87 UV_FS_FSTAT,
|
|
|
88 UV_FS_FTRUNCATE,
|
|
|
89 UV_FS_UTIME,
|
|
|
90 UV_FS_FUTIME,
|
|
|
91 UV_FS_ACCESS,
|
|
|
92 UV_FS_CHMOD,
|
|
|
93 UV_FS_FCHMOD,
|
|
|
94 UV_FS_FSYNC,
|
|
|
95 UV_FS_FDATASYNC,
|
|
|
96 UV_FS_UNLINK,
|
|
|
97 UV_FS_RMDIR,
|
|
|
98 UV_FS_MKDIR,
|
|
|
99 UV_FS_MKDTEMP,
|
|
|
100 UV_FS_RENAME,
|
|
|
101 UV_FS_SCANDIR,
|
|
|
102 UV_FS_LINK,
|
|
|
103 UV_FS_SYMLINK,
|
|
|
104 UV_FS_READLINK,
|
|
|
105 UV_FS_CHOWN,
|
|
|
106 UV_FS_FCHOWN,
|
|
|
107 UV_FS_REALPATH,
|
|
|
108 UV_FS_COPYFILE,
|
|
|
109 UV_FS_LCHOWN,
|
|
|
110 UV_FS_OPENDIR,
|
|
|
111 UV_FS_READDIR,
|
|
|
112 UV_FS_CLOSEDIR,
|
|
|
113 UV_FS_MKSTEMP,
|
|
|
114 UV_FS_LUTIME
|
|
|
115 } uv_fs_type;
|
|
|
116
|
|
|
117 .. c:type:: uv_statfs_t
|
|
|
118
|
|
|
119 Reduced cross platform equivalent of ``struct statfs``.
|
|
|
120 Used in :c:func:`uv_fs_statfs`.
|
|
|
121
|
|
|
122 ::
|
|
|
123
|
|
|
124 typedef struct uv_statfs_s {
|
|
|
125 uint64_t f_type;
|
|
|
126 uint64_t f_bsize;
|
|
|
127 uint64_t f_blocks;
|
|
|
128 uint64_t f_bfree;
|
|
|
129 uint64_t f_bavail;
|
|
|
130 uint64_t f_files;
|
|
|
131 uint64_t f_ffree;
|
|
|
132 uint64_t f_spare[4];
|
|
|
133 } uv_statfs_t;
|
|
|
134
|
|
|
135 .. c:enum:: uv_dirent_type_t
|
|
|
136
|
|
|
137 Type of dirent.
|
|
|
138
|
|
|
139 ::
|
|
|
140
|
|
|
141 typedef enum {
|
|
|
142 UV_DIRENT_UNKNOWN,
|
|
|
143 UV_DIRENT_FILE,
|
|
|
144 UV_DIRENT_DIR,
|
|
|
145 UV_DIRENT_LINK,
|
|
|
146 UV_DIRENT_FIFO,
|
|
|
147 UV_DIRENT_SOCKET,
|
|
|
148 UV_DIRENT_CHAR,
|
|
|
149 UV_DIRENT_BLOCK
|
|
|
150 } uv_dirent_type_t;
|
|
|
151
|
|
|
152
|
|
|
153 .. c:type:: uv_dirent_t
|
|
|
154
|
|
|
155 Cross platform (reduced) equivalent of ``struct dirent``.
|
|
|
156 Used in :c:func:`uv_fs_scandir_next`.
|
|
|
157
|
|
|
158 ::
|
|
|
159
|
|
|
160 typedef struct uv_dirent_s {
|
|
|
161 const char* name;
|
|
|
162 uv_dirent_type_t type;
|
|
|
163 } uv_dirent_t;
|
|
|
164
|
|
|
165 .. c:type:: uv_dir_t
|
|
|
166
|
|
|
167 Data type used for streaming directory iteration.
|
|
|
168 Used by :c:func:`uv_fs_opendir()`, :c:func:`uv_fs_readdir()`, and
|
|
|
169 :c:func:`uv_fs_closedir()`. `dirents` represents a user provided array of
|
|
|
170 `uv_dirent_t`s used to hold results. `nentries` is the user provided maximum
|
|
|
171 array size of `dirents`.
|
|
|
172
|
|
|
173 ::
|
|
|
174
|
|
|
175 typedef struct uv_dir_s {
|
|
|
176 uv_dirent_t* dirents;
|
|
|
177 size_t nentries;
|
|
|
178 } uv_dir_t;
|
|
|
179
|
|
|
180 .. c:type:: void (*uv_fs_cb)(uv_fs_t* req)
|
|
|
181
|
|
|
182 Callback called when a request is completed asynchronously.
|
|
|
183
|
|
|
184
|
|
|
185 Public members
|
|
|
186 ^^^^^^^^^^^^^^
|
|
|
187
|
|
|
188 .. c:member:: uv_loop_t* uv_fs_t.loop
|
|
|
189
|
|
|
190 Loop that started this request and where completion will be reported.
|
|
|
191 Readonly.
|
|
|
192
|
|
|
193 .. c:member:: uv_fs_type uv_fs_t.fs_type
|
|
|
194
|
|
|
195 FS request type.
|
|
|
196
|
|
|
197 .. c:member:: const char* uv_fs_t.path
|
|
|
198
|
|
|
199 Path affecting the request.
|
|
|
200
|
|
|
201 .. c:member:: ssize_t uv_fs_t.result
|
|
|
202
|
|
|
203 Result of the request. < 0 means error, success otherwise. On requests such
|
|
|
204 as :c:func:`uv_fs_read` or :c:func:`uv_fs_write` it indicates the amount of
|
|
|
205 data that was read or written, respectively.
|
|
|
206
|
|
|
207 .. c:member:: uv_stat_t uv_fs_t.statbuf
|
|
|
208
|
|
|
209 Stores the result of :c:func:`uv_fs_stat` and other stat requests.
|
|
|
210
|
|
|
211 .. c:member:: void* uv_fs_t.ptr
|
|
|
212
|
|
|
213 Stores the result of :c:func:`uv_fs_readlink` and
|
|
|
214 :c:func:`uv_fs_realpath` and serves as an alias to `statbuf`.
|
|
|
215
|
|
|
216 .. seealso:: The :c:type:`uv_req_t` members also apply.
|
|
|
217
|
|
|
218
|
|
|
219 API
|
|
|
220 ---
|
|
|
221
|
|
|
222 .. c:function:: void uv_fs_req_cleanup(uv_fs_t* req)
|
|
|
223
|
|
|
224 Cleanup request. Must be called after a request is finished to deallocate
|
|
|
225 any memory libuv might have allocated.
|
|
|
226
|
|
|
227 .. c:function:: int uv_fs_close(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb)
|
|
|
228
|
|
|
229 Equivalent to :man:`close(2)`.
|
|
|
230
|
|
|
231 .. c:function:: int uv_fs_open(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, int mode, uv_fs_cb cb)
|
|
|
232
|
|
|
233 Equivalent to :man:`open(2)`.
|
|
|
234
|
|
|
235 .. note::
|
|
|
236 On Windows libuv uses `CreateFileW` and thus the file is always opened
|
|
|
237 in binary mode. Because of this the O_BINARY and O_TEXT flags are not
|
|
|
238 supported.
|
|
|
239
|
|
|
240 .. c:function:: 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)
|
|
|
241
|
|
|
242 Equivalent to :man:`preadv(2)`. If the `offset` argument is `-1`, then
|
|
|
243 the current file offset is used and updated.
|
|
|
244
|
|
|
245 .. warning::
|
|
|
246 On Windows, under non-MSVC environments (e.g. when GCC or Clang is used
|
|
|
247 to build libuv), files opened using ``UV_FS_O_FILEMAP`` may cause a fatal
|
|
|
248 crash if the memory mapped read operation fails.
|
|
|
249
|
|
|
250 .. c:function:: int uv_fs_unlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb)
|
|
|
251
|
|
|
252 Equivalent to :man:`unlink(2)`.
|
|
|
253
|
|
|
254 .. c:function:: 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)
|
|
|
255
|
|
|
256 Equivalent to :man:`pwritev(2)`. If the `offset` argument is `-1`, then
|
|
|
257 the current file offset is used and updated.
|
|
|
258
|
|
|
259 .. warning::
|
|
|
260 On Windows, under non-MSVC environments (e.g. when GCC or Clang is used
|
|
|
261 to build libuv), files opened using ``UV_FS_O_FILEMAP`` may cause a fatal
|
|
|
262 crash if the memory mapped write operation fails.
|
|
|
263
|
|
|
264 .. c:function:: int uv_fs_mkdir(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb)
|
|
|
265
|
|
|
266 Equivalent to :man:`mkdir(2)`.
|
|
|
267
|
|
|
268 .. note::
|
|
|
269 `mode` is currently not implemented on Windows.
|
|
|
270
|
|
|
271 .. c:function:: int uv_fs_mkdtemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb)
|
|
|
272
|
|
|
273 Equivalent to :man:`mkdtemp(3)`. The result can be found as a null terminated string at `req->path`.
|
|
|
274
|
|
|
275 .. c:function:: int uv_fs_mkstemp(uv_loop_t* loop, uv_fs_t* req, const char* tpl, uv_fs_cb cb)
|
|
|
276
|
|
|
277 Equivalent to :man:`mkstemp(3)`. The created file path can be found as a null terminated string at `req->path`.
|
|
|
278 The file descriptor can be found as an integer at `req->result`.
|
|
|
279
|
|
|
280 .. versionadded:: 1.34.0
|
|
|
281
|
|
|
282 .. c:function:: int uv_fs_rmdir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb)
|
|
|
283
|
|
|
284 Equivalent to :man:`rmdir(2)`.
|
|
|
285
|
|
|
286 .. c:function:: int uv_fs_opendir(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb)
|
|
|
287
|
|
|
288 Opens `path` as a directory stream. On success, a `uv_dir_t` is allocated
|
|
|
289 and returned via `req->ptr`. This memory is not freed by
|
|
|
290 `uv_fs_req_cleanup()`, although `req->ptr` is set to `NULL`. The allocated
|
|
|
291 memory must be freed by calling `uv_fs_closedir()`. On failure, no memory
|
|
|
292 is allocated.
|
|
|
293
|
|
|
294 The contents of the directory can be iterated over by passing the resulting
|
|
|
295 `uv_dir_t` to `uv_fs_readdir()`.
|
|
|
296
|
|
|
297 .. versionadded:: 1.28.0
|
|
|
298
|
|
|
299 .. c:function:: int uv_fs_closedir(uv_loop_t* loop, uv_fs_t* req, uv_dir_t* dir, uv_fs_cb cb)
|
|
|
300
|
|
|
301 Closes the directory stream represented by `dir` and frees the memory
|
|
|
302 allocated by `uv_fs_opendir()`.
|
|
|
303
|
|
|
304 .. versionadded:: 1.28.0
|
|
|
305
|
|
|
306 .. c:function:: int uv_fs_readdir(uv_loop_t* loop, uv_fs_t* req, uv_dir_t* dir, uv_fs_cb cb)
|
|
|
307
|
|
|
308 Iterates over the directory stream, `dir`, returned by a successful
|
|
|
309 `uv_fs_opendir()` call. Prior to invoking `uv_fs_readdir()`, the caller
|
|
|
310 must set `dir->dirents` and `dir->nentries`, representing the array of
|
|
|
311 :c:type:`uv_dirent_t` elements used to hold the read directory entries and
|
|
|
312 its size.
|
|
|
313
|
|
|
314 On success, the result is an integer >= 0 representing the number of entries
|
|
|
315 read from the stream.
|
|
|
316
|
|
|
317 .. versionadded:: 1.28.0
|
|
|
318
|
|
|
319 .. warning::
|
|
|
320 `uv_fs_readdir()` is not thread safe.
|
|
|
321
|
|
|
322 .. note::
|
|
|
323 This function does not return the "." and ".." entries.
|
|
|
324
|
|
|
325 .. note::
|
|
|
326 On success this function allocates memory that must be freed using
|
|
|
327 `uv_fs_req_cleanup()`. `uv_fs_req_cleanup()` must be called before
|
|
|
328 closing the directory with `uv_fs_closedir()`.
|
|
|
329
|
|
|
330 .. c:function:: int uv_fs_scandir(uv_loop_t* loop, uv_fs_t* req, const char* path, int flags, uv_fs_cb cb)
|
|
|
331 .. c:function:: int uv_fs_scandir_next(uv_fs_t* req, uv_dirent_t* ent)
|
|
|
332
|
|
|
333 Equivalent to :man:`scandir(3)`, with a slightly different API. Once the callback
|
|
|
334 for the request is called, the user can use :c:func:`uv_fs_scandir_next` to
|
|
|
335 get `ent` populated with the next directory entry data. When there are no
|
|
|
336 more entries ``UV_EOF`` will be returned.
|
|
|
337
|
|
|
338 .. note::
|
|
|
339 Unlike `scandir(3)`, this function does not return the "." and ".." entries.
|
|
|
340
|
|
|
341 .. note::
|
|
|
342 On Linux, getting the type of an entry is only supported by some file systems (btrfs, ext2,
|
|
|
343 ext3 and ext4 at the time of this writing), check the :man:`getdents(2)` man page.
|
|
|
344
|
|
|
345 .. c:function:: int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb)
|
|
|
346 .. c:function:: int uv_fs_fstat(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb)
|
|
|
347 .. c:function:: int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb)
|
|
|
348
|
|
|
349 Equivalent to :man:`stat(2)`, :man:`fstat(2)` and :man:`lstat(2)` respectively.
|
|
|
350
|
|
|
351 .. c:function:: int uv_fs_statfs(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb)
|
|
|
352
|
|
|
353 Equivalent to :man:`statfs(2)`. On success, a `uv_statfs_t` is allocated
|
|
|
354 and returned via `req->ptr`. This memory is freed by `uv_fs_req_cleanup()`.
|
|
|
355
|
|
|
356 .. note::
|
|
|
357 Any fields in the resulting `uv_statfs_t` that are not supported by the
|
|
|
358 underlying operating system are set to zero.
|
|
|
359
|
|
|
360 .. versionadded:: 1.31.0
|
|
|
361
|
|
|
362 .. c:function:: int uv_fs_rename(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb)
|
|
|
363
|
|
|
364 Equivalent to :man:`rename(2)`.
|
|
|
365
|
|
|
366 .. c:function:: int uv_fs_fsync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb)
|
|
|
367
|
|
|
368 Equivalent to :man:`fsync(2)`.
|
|
|
369
|
|
|
370 .. note::
|
|
|
371 For AIX, `uv_fs_fsync` returns `UV_EBADF` on file descriptors referencing
|
|
|
372 non regular files.
|
|
|
373
|
|
|
374 .. c:function:: int uv_fs_fdatasync(uv_loop_t* loop, uv_fs_t* req, uv_file file, uv_fs_cb cb)
|
|
|
375
|
|
|
376 Equivalent to :man:`fdatasync(2)`.
|
|
|
377
|
|
|
378 .. c:function:: int uv_fs_ftruncate(uv_loop_t* loop, uv_fs_t* req, uv_file file, int64_t offset, uv_fs_cb cb)
|
|
|
379
|
|
|
380 Equivalent to :man:`ftruncate(2)`.
|
|
|
381
|
|
|
382 .. c:function:: 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)
|
|
|
383
|
|
|
384 Copies a file from `path` to `new_path`. Supported `flags` are described below.
|
|
|
385
|
|
|
386 - `UV_FS_COPYFILE_EXCL`: If present, `uv_fs_copyfile()` will fail with
|
|
|
387 `UV_EEXIST` if the destination path already exists. The default behavior
|
|
|
388 is to overwrite the destination if it exists.
|
|
|
389 - `UV_FS_COPYFILE_FICLONE`: If present, `uv_fs_copyfile()` will attempt to
|
|
|
390 create a copy-on-write reflink. If the underlying platform does not
|
|
|
391 support copy-on-write, or an error occurs while attempting to use
|
|
|
392 copy-on-write, a fallback copy mechanism based on
|
|
|
393 :c:func:`uv_fs_sendfile()` is used.
|
|
|
394 - `UV_FS_COPYFILE_FICLONE_FORCE`: If present, `uv_fs_copyfile()` will
|
|
|
395 attempt to create a copy-on-write reflink. If the underlying platform does
|
|
|
396 not support copy-on-write, or an error occurs while attempting to use
|
|
|
397 copy-on-write, then an error is returned.
|
|
|
398
|
|
|
399 .. warning::
|
|
|
400 If the destination path is created, but an error occurs while copying
|
|
|
401 the data, then the destination path is removed. There is a brief window
|
|
|
402 of time between closing and removing the file where another process
|
|
|
403 could access the file.
|
|
|
404
|
|
|
405 .. versionadded:: 1.14.0
|
|
|
406
|
|
|
407 .. versionchanged:: 1.20.0 `UV_FS_COPYFILE_FICLONE` and
|
|
|
408 `UV_FS_COPYFILE_FICLONE_FORCE` are supported.
|
|
|
409
|
|
|
410 .. versionchanged:: 1.33.0 If an error occurs while using
|
|
|
411 `UV_FS_COPYFILE_FICLONE_FORCE`, that error is returned. Previously,
|
|
|
412 all errors were mapped to `UV_ENOTSUP`.
|
|
|
413
|
|
|
414 .. c:function:: 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)
|
|
|
415
|
|
|
416 Limited equivalent to :man:`sendfile(2)`.
|
|
|
417
|
|
|
418 .. c:function:: int uv_fs_access(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb)
|
|
|
419
|
|
|
420 Equivalent to :man:`access(2)` on Unix. Windows uses ``GetFileAttributesW()``.
|
|
|
421
|
|
|
422 .. c:function:: int uv_fs_chmod(uv_loop_t* loop, uv_fs_t* req, const char* path, int mode, uv_fs_cb cb)
|
|
|
423 .. c:function:: int uv_fs_fchmod(uv_loop_t* loop, uv_fs_t* req, uv_file file, int mode, uv_fs_cb cb)
|
|
|
424
|
|
|
425 Equivalent to :man:`chmod(2)` and :man:`fchmod(2)` respectively.
|
|
|
426
|
|
|
427 .. c:function:: int uv_fs_utime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb)
|
|
|
428 .. c:function:: int uv_fs_futime(uv_loop_t* loop, uv_fs_t* req, uv_file file, double atime, double mtime, uv_fs_cb cb)
|
|
|
429 .. c:function:: int uv_fs_lutime(uv_loop_t* loop, uv_fs_t* req, const char* path, double atime, double mtime, uv_fs_cb cb)
|
|
|
430
|
|
|
431 Equivalent to :man:`utime(2)`, :man:`futimes(3)` and :man:`lutimes(3)` respectively.
|
|
|
432
|
|
|
433 Passing `UV_FS_UTIME_NOW` as the atime or mtime sets the timestamp to the
|
|
|
434 current time.
|
|
|
435
|
|
|
436 Passing `UV_FS_UTIME_OMIT` as the atime or mtime leaves the timestamp
|
|
|
437 untouched.
|
|
|
438
|
|
|
439 .. note::
|
|
|
440 z/OS: `uv_fs_lutime()` is not implemented for z/OS. It can still be called but will return
|
|
|
441 ``UV_ENOSYS``.
|
|
|
442
|
|
|
443 .. note::
|
|
|
444 AIX: `uv_fs_futime()` and `uv_fs_lutime()` functions only work for AIX 7.1 and newer.
|
|
|
445 They can still be called on older versions but will return ``UV_ENOSYS``.
|
|
|
446
|
|
|
447 .. versionchanged:: 1.10.0 sub-second precission is supported on Windows
|
|
|
448
|
|
|
449 .. c:function:: int uv_fs_link(uv_loop_t* loop, uv_fs_t* req, const char* path, const char* new_path, uv_fs_cb cb)
|
|
|
450
|
|
|
451 Equivalent to :man:`link(2)`.
|
|
|
452
|
|
|
453 .. c:function:: 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)
|
|
|
454
|
|
|
455 Equivalent to :man:`symlink(2)`.
|
|
|
456
|
|
|
457 .. note::
|
|
|
458 On Windows the `flags` parameter can be specified to control how the symlink will
|
|
|
459 be created:
|
|
|
460
|
|
|
461 * ``UV_FS_SYMLINK_DIR``: indicates that `path` points to a directory.
|
|
|
462
|
|
|
463 * ``UV_FS_SYMLINK_JUNCTION``: request that the symlink is created
|
|
|
464 using junction points.
|
|
|
465
|
|
|
466 .. c:function:: int uv_fs_readlink(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb)
|
|
|
467
|
|
|
468 Equivalent to :man:`readlink(2)`.
|
|
|
469 The resulting string is stored in `req->ptr`.
|
|
|
470
|
|
|
471 .. c:function:: int uv_fs_realpath(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb)
|
|
|
472
|
|
|
473 Equivalent to :man:`realpath(3)` on Unix. Windows uses `GetFinalPathNameByHandleW <https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew>`_.
|
|
|
474 The resulting string is stored in `req->ptr`.
|
|
|
475
|
|
|
476 .. warning::
|
|
|
477 This function has certain platform-specific caveats that were discovered when used in Node.
|
|
|
478
|
|
|
479 * macOS and other BSDs: this function will fail with UV_ELOOP if more than 32 symlinks are
|
|
|
480 found while resolving the given path. This limit is hardcoded and cannot be sidestepped.
|
|
|
481 * Windows: while this function works in the common case, there are a number of corner cases
|
|
|
482 where it doesn't:
|
|
|
483
|
|
|
484 - Paths in ramdisk volumes created by tools which sidestep the Volume Manager (such as ImDisk)
|
|
|
485 cannot be resolved.
|
|
|
486 - Inconsistent casing when using drive letters.
|
|
|
487 - Resolved path bypasses subst'd drives.
|
|
|
488
|
|
|
489 While this function can still be used, it's not recommended if scenarios such as the
|
|
|
490 above need to be supported.
|
|
|
491
|
|
|
492 The background story and some more details on these issues can be checked
|
|
|
493 `here <https://github.com/nodejs/node/issues/7726>`_.
|
|
|
494
|
|
|
495 .. versionadded:: 1.8.0
|
|
|
496
|
|
|
497 .. c:function:: 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)
|
|
|
498 .. c:function:: 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)
|
|
|
499 .. c:function:: 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)
|
|
|
500
|
|
|
501 Equivalent to :man:`chown(2)`, :man:`fchown(2)` and :man:`lchown(2)` respectively.
|
|
|
502
|
|
|
503 .. note::
|
|
|
504 These functions are not implemented on Windows.
|
|
|
505
|
|
|
506 .. versionchanged:: 1.21.0 implemented uv_fs_lchown
|
|
|
507
|
|
|
508 .. c:function:: uv_fs_type uv_fs_get_type(const uv_fs_t* req)
|
|
|
509
|
|
|
510 Returns `req->fs_type`.
|
|
|
511
|
|
|
512 .. versionadded:: 1.19.0
|
|
|
513
|
|
|
514 .. c:function:: ssize_t uv_fs_get_result(const uv_fs_t* req)
|
|
|
515
|
|
|
516 Returns `req->result`.
|
|
|
517
|
|
|
518 .. versionadded:: 1.19.0
|
|
|
519
|
|
|
520 .. c:function:: int uv_fs_get_system_error(const uv_fs_t* req)
|
|
|
521
|
|
|
522 Returns the platform specific error code - `GetLastError()` value on Windows
|
|
|
523 and `-(req->result)` on other platforms.
|
|
|
524
|
|
|
525 .. versionadded:: 1.38.0
|
|
|
526
|
|
|
527 .. c:function:: void* uv_fs_get_ptr(const uv_fs_t* req)
|
|
|
528
|
|
|
529 Returns `req->ptr`.
|
|
|
530
|
|
|
531 .. versionadded:: 1.19.0
|
|
|
532
|
|
|
533 .. c:function:: const char* uv_fs_get_path(const uv_fs_t* req)
|
|
|
534
|
|
|
535 Returns `req->path`.
|
|
|
536
|
|
|
537 .. versionadded:: 1.19.0
|
|
|
538
|
|
|
539 .. c:function:: uv_stat_t* uv_fs_get_statbuf(uv_fs_t* req)
|
|
|
540
|
|
|
541 Returns `&req->statbuf`.
|
|
|
542
|
|
|
543 .. versionadded:: 1.19.0
|
|
|
544
|
|
|
545 .. seealso:: The :c:type:`uv_req_t` API functions also apply.
|
|
|
546
|
|
|
547 Helper functions
|
|
|
548 ----------------
|
|
|
549
|
|
|
550 .. c:function:: uv_os_fd_t uv_get_osfhandle(int fd)
|
|
|
551
|
|
|
552 For a file descriptor in the C runtime, get the OS-dependent handle.
|
|
|
553 On UNIX, returns the ``fd`` intact. On Windows, this calls `_get_osfhandle <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/get-osfhandle?view=vs-2019>`_.
|
|
|
554 Note that the return value is still owned by the C runtime,
|
|
|
555 any attempts to close it or to use it after closing the fd may lead to malfunction.
|
|
|
556
|
|
|
557 .. versionadded:: 1.12.0
|
|
|
558
|
|
|
559 .. c:function:: int uv_open_osfhandle(uv_os_fd_t os_fd)
|
|
|
560
|
|
|
561 For a OS-dependent handle, get the file descriptor in the C runtime.
|
|
|
562 On UNIX, returns the ``os_fd`` intact. On Windows, this calls `_open_osfhandle <https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/open-osfhandle?view=vs-2019>`_.
|
|
|
563 Note that this consumes the argument, any attempts to close it or to use it
|
|
|
564 after closing the return value may lead to malfunction.
|
|
|
565
|
|
|
566 .. versionadded:: 1.23.0
|
|
|
567
|
|
|
568 File open constants
|
|
|
569 -------------------
|
|
|
570
|
|
|
571 .. c:macro:: UV_FS_O_APPEND
|
|
|
572
|
|
|
573 The file is opened in append mode. Before each write, the file offset is
|
|
|
574 positioned at the end of the file.
|
|
|
575
|
|
|
576 .. c:macro:: UV_FS_O_CREAT
|
|
|
577
|
|
|
578 The file is created if it does not already exist.
|
|
|
579
|
|
|
580 .. c:macro:: UV_FS_O_DIRECT
|
|
|
581
|
|
|
582 File I/O is done directly to and from user-space buffers, which must be
|
|
|
583 aligned. Buffer size and address should be a multiple of the physical sector
|
|
|
584 size of the block device.
|
|
|
585
|
|
|
586 .. note::
|
|
|
587 `UV_FS_O_DIRECT` is supported on Linux, and on Windows via
|
|
|
588 `FILE_FLAG_NO_BUFFERING <https://docs.microsoft.com/en-us/windows/win32/fileio/file-buffering>`_.
|
|
|
589 `UV_FS_O_DIRECT` is not supported on macOS.
|
|
|
590
|
|
|
591 .. c:macro:: UV_FS_O_DIRECTORY
|
|
|
592
|
|
|
593 If the path is not a directory, fail the open.
|
|
|
594
|
|
|
595 .. note::
|
|
|
596 `UV_FS_O_DIRECTORY` is not supported on Windows.
|
|
|
597
|
|
|
598 .. c:macro:: UV_FS_O_DSYNC
|
|
|
599
|
|
|
600 The file is opened for synchronous I/O. Write operations will complete once
|
|
|
601 all data and a minimum of metadata are flushed to disk.
|
|
|
602
|
|
|
603 .. note::
|
|
|
604 `UV_FS_O_DSYNC` is supported on Windows via
|
|
|
605 `FILE_FLAG_WRITE_THROUGH <https://docs.microsoft.com/en-us/windows/win32/fileio/file-buffering>`_.
|
|
|
606
|
|
|
607 .. c:macro:: UV_FS_O_EXCL
|
|
|
608
|
|
|
609 If the `O_CREAT` flag is set and the file already exists, fail the open.
|
|
|
610
|
|
|
611 .. note::
|
|
|
612 In general, the behavior of `O_EXCL` is undefined if it is used without
|
|
|
613 `O_CREAT`. There is one exception: on Linux 2.6 and later, `O_EXCL` can
|
|
|
614 be used without `O_CREAT` if pathname refers to a block device. If the
|
|
|
615 block device is in use by the system (e.g., mounted), the open will fail
|
|
|
616 with the error `EBUSY`.
|
|
|
617
|
|
|
618 .. c:macro:: UV_FS_O_EXLOCK
|
|
|
619
|
|
|
620 Atomically obtain an exclusive lock.
|
|
|
621
|
|
|
622 .. note::
|
|
|
623 `UV_FS_O_EXLOCK` is only supported on macOS and Windows.
|
|
|
624
|
|
|
625 .. versionchanged:: 1.17.0 support is added for Windows.
|
|
|
626
|
|
|
627 .. c:macro:: UV_FS_O_FILEMAP
|
|
|
628
|
|
|
629 Use a memory file mapping to access the file. When using this flag, the
|
|
|
630 file cannot be open multiple times concurrently.
|
|
|
631
|
|
|
632 .. note::
|
|
|
633 `UV_FS_O_FILEMAP` is only supported on Windows.
|
|
|
634
|
|
|
635 .. c:macro:: UV_FS_O_NOATIME
|
|
|
636
|
|
|
637 Do not update the file access time when the file is read.
|
|
|
638
|
|
|
639 .. note::
|
|
|
640 `UV_FS_O_NOATIME` is not supported on Windows.
|
|
|
641
|
|
|
642 .. c:macro:: UV_FS_O_NOCTTY
|
|
|
643
|
|
|
644 If the path identifies a terminal device, opening the path will not cause
|
|
|
645 that terminal to become the controlling terminal for the process (if the
|
|
|
646 process does not already have one).
|
|
|
647
|
|
|
648 .. note::
|
|
|
649 `UV_FS_O_NOCTTY` is not supported on Windows.
|
|
|
650
|
|
|
651 .. c:macro:: UV_FS_O_NOFOLLOW
|
|
|
652
|
|
|
653 If the path is a symbolic link, fail the open.
|
|
|
654
|
|
|
655 .. note::
|
|
|
656 `UV_FS_O_NOFOLLOW` is not supported on Windows.
|
|
|
657
|
|
|
658 .. c:macro:: UV_FS_O_NONBLOCK
|
|
|
659
|
|
|
660 Open the file in nonblocking mode if possible.
|
|
|
661
|
|
|
662 .. note::
|
|
|
663 `UV_FS_O_NONBLOCK` is not supported on Windows.
|
|
|
664
|
|
|
665 .. c:macro:: UV_FS_O_RANDOM
|
|
|
666
|
|
|
667 Access is intended to be random. The system can use this as a hint to
|
|
|
668 optimize file caching.
|
|
|
669
|
|
|
670 .. note::
|
|
|
671 `UV_FS_O_RANDOM` is only supported on Windows via
|
|
|
672 `FILE_FLAG_RANDOM_ACCESS <https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew>`_.
|
|
|
673
|
|
|
674 .. c:macro:: UV_FS_O_RDONLY
|
|
|
675
|
|
|
676 Open the file for read-only access.
|
|
|
677
|
|
|
678 .. c:macro:: UV_FS_O_RDWR
|
|
|
679
|
|
|
680 Open the file for read-write access.
|
|
|
681
|
|
|
682 .. c:macro:: UV_FS_O_SEQUENTIAL
|
|
|
683
|
|
|
684 Access is intended to be sequential from beginning to end. The system can
|
|
|
685 use this as a hint to optimize file caching.
|
|
|
686
|
|
|
687 .. note::
|
|
|
688 `UV_FS_O_SEQUENTIAL` is only supported on Windows via
|
|
|
689 `FILE_FLAG_SEQUENTIAL_SCAN <https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew>`_.
|
|
|
690
|
|
|
691 .. c:macro:: UV_FS_O_SHORT_LIVED
|
|
|
692
|
|
|
693 The file is temporary and should not be flushed to disk if possible.
|
|
|
694
|
|
|
695 .. note::
|
|
|
696 `UV_FS_O_SHORT_LIVED` is only supported on Windows via
|
|
|
697 `FILE_ATTRIBUTE_TEMPORARY <https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew>`_.
|
|
|
698
|
|
|
699 .. c:macro:: UV_FS_O_SYMLINK
|
|
|
700
|
|
|
701 Open the symbolic link itself rather than the resource it points to.
|
|
|
702
|
|
|
703 .. c:macro:: UV_FS_O_SYNC
|
|
|
704
|
|
|
705 The file is opened for synchronous I/O. Write operations will complete once
|
|
|
706 all data and all metadata are flushed to disk.
|
|
|
707
|
|
|
708 .. note::
|
|
|
709 `UV_FS_O_SYNC` is supported on Windows via
|
|
|
710 `FILE_FLAG_WRITE_THROUGH <https://docs.microsoft.com/en-us/windows/win32/fileio/file-buffering>`_.
|
|
|
711
|
|
|
712 .. c:macro:: UV_FS_O_TEMPORARY
|
|
|
713
|
|
|
714 The file is temporary and should not be flushed to disk if possible.
|
|
|
715
|
|
|
716 .. note::
|
|
|
717 `UV_FS_O_TEMPORARY` is only supported on Windows via
|
|
|
718 `FILE_ATTRIBUTE_TEMPORARY <https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew>`_.
|
|
|
719
|
|
|
720 .. c:macro:: UV_FS_O_TRUNC
|
|
|
721
|
|
|
722 If the file exists and is a regular file, and the file is opened
|
|
|
723 successfully for write access, its length shall be truncated to zero.
|
|
|
724
|
|
|
725 .. c:macro:: UV_FS_O_WRONLY
|
|
|
726
|
|
|
727 Open the file for write-only access.
|