Файловая система
Стабильность: 2 — Стабильный
Модуль node:fs позволяет взаимодействовать с файловой системой способом, основанным на стандартных функциях POSIX.
Чтобы использовать API на основе промисов:
Модули JavaScript
import * as fs from 'node:fs/promises';
CommonJS
const fs = require('node:fs/promises');
Чтобы использовать API с колбэками и синхронный API:
Модули JavaScript
import * as fs from 'node:fs';
CommonJS
const fs = require('node:fs');
Все операции с файловой системой имеют синхронные формы, формы с колбэками и формы на основе промисов и доступны как с использованием синтаксиса CommonJS, так и модулей ES6 (ESM).
Пример с промисами
Операции на основе промисов возвращают промис, который выполняется после завершения асинхронной операции.
Модули JavaScript
import { unlink } from 'node:fs/promises';
try {
await unlink('/tmp/hello');
console.log('successfully deleted /tmp/hello');
} catch (error) {
console.error('there was an error:', error.message);
}
CommonJS
const { unlink } = require('node:fs/promises');
(async function(path) {
try {
await unlink(path);
console.log(`successfully deleted ${path}`);
} catch (error) {
console.error('there was an error:', error.message);
}
})('/tmp/hello');
Пример с колбэком
Форма с колбэком принимает функцию обратного вызова, которая вызывается по завершении операции, в качестве последнего аргумента и выполняет операцию асинхронно. Аргументы, передаваемые функции обратного вызова, зависят от метода, но первый аргумент всегда зарезервирован для исключения. Если операция завершилась успешно, первым аргументом будет null или undefined.
Модули JavaScript
import { unlink } from 'node:fs';
unlink('/tmp/hello', (err) => {
if (err) throw err;
console.log('successfully deleted /tmp/hello');
});
CommonJS
const { unlink } = require('node:fs');
unlink('/tmp/hello', (err) => {
if (err) throw err;
console.log('successfully deleted /tmp/hello');
});
Версии API модуля node:fs на основе колбэков предпочтительнее API на основе промисов, если требуется максимальная производительность (как с точки зрения времени выполнения, так и выделения памяти).
Синхронный пример
Синхронный API блокирует цикл событий Node.js и дальнейшее выполнение JavaScript до завершения операции. Исключения выбрасываются немедленно, и их можно обработать с помощью try…catch или позволить им распространиться выше по стеку вызовов.
Модули JavaScript
import { unlinkSync } from 'node:fs';
try {
unlinkSync('/tmp/hello');
console.log('successfully deleted /tmp/hello');
} catch (err) {
// handle the error
}
CommonJS
const { unlinkSync } = require('node:fs');
try {
unlinkSync('/tmp/hello');
console.log('successfully deleted /tmp/hello');
} catch (err) {
// handle the error
}
API промисов
API fs/promises предоставляет асинхронные методы файловой системы, возвращающие промисы.
API промисов использует базовый пул потоков Node.js для выполнения операций с файловой системой вне потока цикла событий. Эти операции не синхронизированы и не являются потокобезопасными. При выполнении нескольких одновременных изменений одного файла следует соблюдать осторожность, иначе данные могут быть повреждены.
Класс: FileHandle
Объект <FileHandle> является оберткой для числового дескриптора файла.
Экземпляры объекта <FileHandle> создаются методом fsPromises.open().
Все объекты <FileHandle> являются объектами <EventEmitter>.
Если объект <FileHandle> не закрыт с помощью метода filehandle.close(), он попытается автоматически закрыть дескриптор файла и выдать предупреждение процесса, помогая предотвратить утечки памяти. Пожалуйста, не полагайтесь на это поведение, поскольку оно может быть ненадежным, а файл может остаться открытым. Вместо этого всегда явно закрывайте объекты <FileHandle>. В будущем Node.js может изменить это поведение.
Событие: 'close'
Событие 'close' генерируется после закрытия объекта <FileHandle>, когда его больше нельзя использовать.
filehandle.appendFile(data[, options])
-
data<string>|<Buffer>|<TypedArray>|<DataView>|<AsyncIterable>|<Stream> -
options<Object>|<string>-
encoding<string>|<null>По умолчанию:'utf8' -
signal<AbortSignal>|<undefined>позволяет прервать выполняющуюся операцию writeFile. По умолчанию:undefined
-
- Возвращает:
<Promise>В случае успеха выполняется сundefined.
Псевдоним для filehandle.writeFile().
При работе с дескрипторами файлов режим нельзя изменить по сравнению с тем, который был задан с помощью fsPromises.open(). Поэтому это эквивалентно filehandle.writeFile().
filehandle.chmod(mode)
-
mode<integer>битовая маска режима файла. - Возвращает:
<Promise>При успешном выполнении выполняется сundefined.
Изменяет права доступа к файлу. См. chmod(2).
filehandle.chown(uid, gid)
-
uid<integer>идентификатор пользователя нового владельца файла. -
gid<integer>идентификатор группы новой группы файла. - Возвращает:
<Promise>При успешном выполнении выполняется сundefined.
Изменяет владельца файла. Обертка для chown(2).
filehandle.close()
- Возвращает:
<Promise>При успешном выполнении выполняется сundefined.
Закрывает файловый дескриптор после завершения всех ожидающих операций с ним.
import { open } from 'node:fs/promises';
let filehandle;
try {
filehandle = await open('thefile.txt', 'r');
} finally {
await filehandle?.close();
}
mjscopy
filehandle.createReadStream([options])
-
options<Object>-
encoding<string>По умолчанию:null -
autoClose<boolean>По умолчанию:true -
emitClose<boolean>По умолчанию:true -
start<integer> -
end<integer>По умолчанию:Infinity -
highWaterMark<integer>По умолчанию:64 * 1024 -
signal<AbortSignal>|<undefined>По умолчанию:undefined
-
- Возвращает:
<fs.ReadStream>
options может содержать значения start и end, чтобы прочитать диапазон байтов из файла, а не весь файл целиком. И start, и end включаются в диапазон; отсчет начинается с 0, допустимые значения находятся в диапазоне [0, Number.MAX_SAFE_INTEGER]. Если start не указано или равно undefined, filehandle.createReadStream() выполняет последовательное чтение с текущей позиции в файле. encoding может иметь любое из значений, принимаемых <Buffer>.
Если FileHandle указывает на символьное устройство, поддерживающее только блокирующее чтение (например, клавиатуру или звуковую карту), операции чтения не завершаются до появления данных. Это может помешать завершению процесса и естественному закрытию потока.
По умолчанию поток генерирует событие 'close' после уничтожения. Чтобы изменить это поведение, задайте для параметра emitClose значение false.
import { open } from 'node:fs/promises';
const fd = await open('/dev/input/event0');
// Create a stream from some character device.
const stream = fd.createReadStream();
setTimeout(() => {
stream.close(); // This may not close the stream.
// Artificially marking end-of-stream, as if the underlying resource had
// indicated end-of-file by itself, allows the stream to close.
// This does not cancel pending read operations, and if there is such an
// operation, the process may still not be able to exit successfully
// until it finishes.
stream.push(null);
stream.read(0);
}, 100);
mjscopy
Если autoClose имеет значение false, файловый дескриптор не будет закрыт, даже если произойдет ошибка. Приложение должно самостоятельно закрыть его и убедиться, что утечки файловых дескрипторов нет. Если для autoClose задано значение true (поведение по умолчанию), файловый дескриптор будет автоматически закрыт при возникновении 'error' или 'end'.
Пример чтения последних 10 байтов файла длиной 100 байтов:
import { open } from 'node:fs/promises';
const fd = await open('sample.txt');
fd.createReadStream({ start: 90, end: 99 });
mjscopy
filehandle.createWriteStream([options])
-
options<Object> - Возвращает:
<fs.WriteStream>
options также может включать параметр start, позволяющий записывать данные с некоторой позиции после начала файла; допустимые значения находятся в диапазоне [0, Number.MAX_SAFE_INTEGER]. Для изменения файла вместо его замены может потребоваться установить параметр flags open в значение r+ вместо значения по умолчанию r. Значение encoding может быть любым из значений, принимаемых <Buffer>.
Если для autoClose задано значение true (поведение по умолчанию) в 'error' или 'finish', файловый дескриптор будет закрыт автоматически. Если autoClose имеет значение false, файловый дескриптор не будет закрыт, даже если произойдёт ошибка. Приложение должно закрыть его самостоятельно и убедиться, что утечки файловых дескрипторов не происходит.
По умолчанию поток генерирует событие 'close' после уничтожения. Чтобы изменить это поведение, задайте для параметра emitClose значение false.
filehandle.datasync()
- Возвращает:
<Promise>Выполняется с результатомundefinedв случае успеха.
Принудительно переводит все поставленные в очередь операции ввода-вывода, связанные с файлом, в состояние завершения синхронизированного ввода-вывода операционной системы. Подробности см. в документации POSIX для fdatasync(2).
В отличие от filehandle.sync, этот метод не сбрасывает изменённые метаданные.
filehandle.fd
- Тип:
<number>Числовой файловый дескриптор, управляемый объектом<FileHandle>.
filehandle.pull([...transforms][, options])
Стабильность: 1 — экспериментальный
-
...transforms<Function>|<Object>Необязательные преобразования, применяемые черезstream/iter pull(). -
options<Object>-
signal<AbortSignal> -
autoClose<boolean>Закрыть файловый дескриптор при завершении потока. По умолчанию:false. -
start<number>Смещение в байтах, с которого начинается чтение. Если указано, для чтения используется явное позиционирование (семантикаpread). По умолчанию: текущая позиция в файле. -
limit<number>Максимальное количество байтов для чтения до завершения итератора. Чтение прекращается, когда переданоlimitбайтов или достигнут EOF — в зависимости от того, что наступит раньше. По умолчанию: чтение до EOF. -
chunkSize<number>Размер в байтах буфера, выделяемого для каждой операции чтения. По умолчанию:131072(128 КБ).
-
- Возвращает: {AsyncIterable<Uint8Array[]>}
Возвращает содержимое файла в виде асинхронного итерируемого объекта, используя pull-модель node:stream/iter. Чтение выполняется блоками по chunkSize байт (по умолчанию — 128 КБ). Если указаны преобразования, они применяются через stream/iter pull().
Файловый дескриптор блокируется на время потребления итерируемого объекта и разблокируется после завершения итерации, возникновения ошибки или прерывания потребителем.
Эта функция доступна только при включённом флаге --experimental-stream-iter.
Модули JavaScript
import { open } from 'node:fs/promises';
import { text } from 'node:stream/iter';
import { compressGzip } from 'node:zlib/iter';
const fh = await open('input.txt', 'r');
// Read as text
console.log(await text(fh.pull({ autoClose: true })));
// Read 1 KB starting at byte 100
const fh2 = await open('input.txt', 'r');
console.log(await text(fh2.pull({ start: 100, limit: 1024, autoClose: true })));
// Read with compression
const fh3 = await open('input.txt', 'r');
const compressed = fh3.pull(compressGzip(), { autoClose: true });
CommonJS
const { open } = require('node:fs/promises');
const { text } = require('node:stream/iter');
const { compressGzip } = require('node:zlib/iter');
async function run() {
const fh = await open('input.txt', 'r');
// Read as text
console.log(await text(fh.pull({ autoClose: true })));
// Read 1 KB starting at byte 100
const fh2 = await open('input.txt', 'r');
console.log(await text(fh2.pull({ start: 100, limit: 1024, autoClose: true })));
// Read with compression
const fh3 = await open('input.txt', 'r');
const compressed = fh3.pull(compressGzip(), { autoClose: true });
}
run().catch(console.error);
filehandle.pullSync([...transforms][, options])
Стабильность: 1 — экспериментальный
-
...transforms<Function>|<Object>Необязательные преобразования, применяемые черезstream/iter pullSync(). -
options<Object>-
autoClose<boolean>Закрывать файловый дескриптор по завершении потока. По умолчанию:false. -
start<number>Смещение в байтах, с которого начинается чтение. Если указано, для чтения используется явное позиционирование. По умолчанию: текущая позиция в файле. -
limit<number>Максимальное количество байтов для чтения до завершения итератора. По умолчанию: чтение до конца файла. -
chunkSize<number>Размер в байтах буфера, выделяемого для каждой операции чтения. По умолчанию:131072(128 КБ).
-
- Возвращает: {Iterable<Uint8Array[]>}
Синхронный аналог filehandle.pull(). Возвращает синхронный итерируемый объект, который считывает файл с помощью синхронного ввода-вывода в основном потоке. Данные считываются блоками по chunkSize байт (по умолчанию — 128 КБ).
Файловый дескриптор заблокирован на время обхода итерируемого объекта. В отличие от асинхронного pull(), этот метод не поддерживает AbortSignal, поскольку все операции выполняются синхронно.
Эта функция доступна только при включенном флаге --experimental-stream-iter.
Модули JavaScript
import { open } from 'node:fs/promises';
import { textSync, pipeToSync } from 'node:stream/iter';
import { compressGzipSync, decompressGzipSync } from 'node:zlib/iter';
const fh = await open('input.txt', 'r');
// Read as text (sync)
console.log(textSync(fh.pullSync({ autoClose: true })));
// Sync compress pipeline: file -> gzip -> file
const src = await open('input.txt', 'r');
const dst = await open('output.gz', 'w');
pipeToSync(src.pullSync(compressGzipSync(), { autoClose: true }), dst.writer({ autoClose: true }));
CommonJS
const { open } = require('node:fs/promises');
const { textSync, pipeToSync } = require('node:stream/iter');
const { compressGzipSync, decompressGzipSync } = require('node:zlib/iter');
async function run() {
const fh = await open('input.txt', 'r');
// Read as text (sync)
console.log(textSync(fh.pullSync({ autoClose: true })));
// Sync compress pipeline: file -> gzip -> file
const src = await open('input.txt', 'r');
const dst = await open('output.gz', 'w');
pipeToSync(
src.pullSync(compressGzipSync(), { autoClose: true }),
dst.writer({ autoClose: true }),
);
}
run().catch(console.error);
filehandle.read(buffer, offset, length, position)
-
buffer<Buffer>|<TypedArray>|<DataView>Буфер, который будет заполнен считанными данными файла. -
offset<integer>Позиция в буфере, с которой начинается запись данных. По умолчанию:0 -
length<integer>Количество байтов для чтения. По умолчанию:buffer.byteLength - offset -
position<integer>|<bigint>|<null>Позиция, с которой начинается чтение данных из файла. Еслиnullили-1, данные будут считываться с текущей позиции в файле, а позиция будет обновлена. Еслиposition— неотрицательное целое число, текущая позиция в файле останется без изменений. По умолчанию:null - Возвращает:
<Promise>При успешном выполнении возвращает объект с двумя свойствами:-
bytesRead<integer>Количество считанных байтов -
buffer<Buffer>|<TypedArray>|<DataView>Ссылка на переданный аргументbuffer.
-
Считывает данные из файла и сохраняет их в указанном буфере.
Если файл не изменяется параллельно, конец файла считается достигнутым, когда количество считанных байтов равно нулю.
filehandle.read([options])
-
options<Object>-
buffer<Buffer>|<TypedArray>|<DataView>Буфер, который будет заполнен считанными данными файла. По умолчанию:Buffer.alloc(16384) -
offset<integer>Позиция в буфере, с которой начнётся заполнение. По умолчанию:0 -
length<integer>Количество байтов для чтения. По умолчанию:buffer.byteLength - offset -
position<integer>|<bigint>|<null>Позиция, с которой следует начать чтение данных из файла. Еслиnullили-1, данные будут считываться с текущей позиции в файле, и эта позиция будет обновлена. Еслиposition— неотрицательное целое число, текущая позиция в файле останется неизменной. По умолчанию::null
-
- Возвращает:
<Promise>При успешном выполнении возвращает объект с двумя свойствами:-
bytesRead<integer>Количество прочитанных байтов -
buffer<Buffer>|<TypedArray>|<DataView>Ссылка на переданный аргументbuffer.
-
Считывает данные из файла и сохраняет их в указанном буфере.
Если файл не изменяется параллельно, конец файла достигается, когда количество прочитанных байтов равно нулю.
filehandle.read(buffer[, options])
-
buffer<Buffer>|<TypedArray>|<DataView>Буфер, который будет заполнен считанными данными файла. -
options<Object>-
offset<integer>Позиция в буфере, с которой начнётся заполнение. По умолчанию:0 -
length<integer>Количество байтов для чтения. По умолчанию:buffer.byteLength - offset -
position<integer>|<bigint>|<null>Позиция, с которой следует начать чтение данных из файла. Еслиnullили-1, данные будут считываться с текущей позиции в файле, и эта позиция будет обновлена. Еслиposition— неотрицательное целое число, текущая позиция в файле останется неизменной. По умолчанию::null
-
- Возвращает:
<Promise>При успешном выполнении возвращает объект с двумя свойствами:-
bytesRead<integer>Количество прочитанных байтов -
buffer<Buffer>|<TypedArray>|<DataView>Ссылка на переданный аргументbuffer.
-
Считывает данные из файла и сохраняет их в указанном буфере.
Если файл не изменяется параллельно, конец файла достигается, когда количество прочитанных байтов равно нулю.
filehandle.readableWebStream([options])
-
options<Object>-
autoClose<boolean>Если значение равно true,<FileHandle>закрывается при закрытии потока. По умолчанию:false
-
- Возвращает:
<ReadableStream>
Возвращает ориентированный на байты ReadableStream, который можно использовать для чтения содержимого файла.
Будет вызвана ошибка, если этот метод вызывается более одного раза или после закрытия либо начала закрытия FileHandle.
Модули JavaScript
import {
open,
} from 'node:fs/promises';
const file = await open('./some/file/to/read');
for await (const chunk of file.readableWebStream())
console.log(chunk);
await file.close();
CommonJS
const {
open,
} = require('node:fs/promises');
(async () => {
const file = await open('./some/file/to/read');
for await (const chunk of file.readableWebStream())
console.log(chunk);
await file.close();
})();
Хотя ReadableStream прочитает файл целиком, он не закроет FileHandle автоматически. Пользовательский код по-прежнему должен вызывать метод fileHandle.close(), если только для параметра autoClose не задано значение true.
filehandle.readFile(options)
-
options<Object>|<string>-
encoding<string>|<null>По умолчанию:null -
signal<AbortSignal>позволяет прервать выполняющееся чтение файла
-
- Возвращает:
<Promise>Выполняется при успешном чтении и содержит содержимое файла. Если кодировка не указана (с помощьюoptions.encoding), данные возвращаются как объект<Buffer>. В противном случае данные будут строкой.
Асинхронно считывает всё содержимое файла.
Если options — строка, она задаёт encoding.
<FileHandle> должен поддерживать чтение.
Если для файлового дескриптора выполняется один или несколько вызовов filehandle.read(), а затем вызывается filehandle.readFile(), данные будут прочитаны с текущей позиции до конца файла. Чтение не всегда начинается с начала файла.
filehandle.readLines([options])
-
options<Object> - Возвращает:
<readline.InterfaceConstructor>
Вспомогательный метод для создания интерфейса readline и потока для чтения файла. Параметры см. в разделе filehandle.createReadStream().
Модули JavaScript
import { open } from 'node:fs/promises';
const file = await open('./some/file/to/read');
for await (const line of file.readLines()) {
console.log(line);
}
CommonJS
const { open } = require('node:fs/promises');
(async () => {
const file = await open('./some/file/to/read');
for await (const line of file.readLines()) {
console.log(line);
}
})();
filehandle.readv(buffers[, position])
-
buffers<Buffer[]>|<TypedArray[]>|<DataView[]> -
position<integer>|<null>Смещение от начала файла, с которого следует считывать данные. Еслиpositionне является значениемnumber, данные будут считываться с текущей позиции. По умолчанию:null - Возвращает:
<Promise>При успешном выполнении возвращает объект с двумя свойствами:-
bytesRead<integer>количество прочитанных байтов -
buffers<Buffer[]>|<TypedArray[]>|<DataView[]>свойство, содержащее ссылку на исходныйbuffers.
-
Читает данные из файла и записывает их в массив {ArrayBufferView}.
filehandle.stat([options])
-
options<Object>-
bigint<boolean>Следует ли числовым значениям в возвращаемом объекте<fs.Stats>иметь типbigint. По умолчанию:false. -
signal<AbortSignal>AbortSignal для отмены операции. По умолчанию:undefined.
-
- Возвращает:
<Promise>В случае выполнения содержит объект<fs.Stats>для файла.
filehandle.sync()
- Возвращает:
<Promise>В случае успешного выполнения содержитundefined.
Запрашивает сброс всех данных для открытого дескриптора файла на устройство хранения. Конкретная реализация зависит от операционной системы и устройства. Подробнее см. в документации POSIX fsync(2).
filehandle.truncate(len)
-
len<integer>По умолчанию:0 - Возвращает:
<Promise>В случае успешного выполнения содержитundefined.
Усекает файл.
Если размер файла превышает len байт, в файле останутся только первые len байт.
В следующем примере в файле остаются только первые четыре байта:
import { open } from 'node:fs/promises';
let filehandle = null;
try {
filehandle = await open('temp.txt', 'r+');
await filehandle.truncate(4);
} finally {
await filehandle?.close();
}
mjscopy
Если исходный размер файла был меньше len байт, файл увеличивается, а добавленная часть заполняется нулевыми байтами ('\0'):
Если len отрицательно, будет использоваться 0.
filehandle.utimes(atime, mtime)
Изменяет временные метки файловой системы объекта, на который ссылается <FileHandle>, после чего в случае успеха промис выполняется без аргументов.
filehandle.write(buffer, offset[, length[, position]])
-
buffer<Buffer>|<TypedArray>|<DataView> -
offset<integer>Начальная позиция данных для записи внутриbuffer. -
length<integer>Количество байтов, записываемых изbuffer. По умолчанию:buffer.byteLength - offset -
position<integer>|<null>Смещение от начала файла, по которому следует записать данные изbuffer. Еслиpositionне является значениемnumber, данные будут записаны в текущую позицию. Подробнее см. в документации POSIXpwrite(2). По умолчанию:null - Возвращает:
<Promise>
Записывает buffer в файл.
Промис выполняется с объектом, содержащим два свойства:
-
bytesWritten<integer>количество записанных байтов -
buffer<Buffer>|<TypedArray>|<DataView>ссылка на записанныйbuffer.
Небезопасно вызывать filehandle.write() несколько раз для одного файла, не дожидаясь выполнения (или отклонения) промиса. В этом случае используйте filehandle.createWriteStream().
В Linux позиционная запись не работает, если файл открыт в режиме добавления. Ядро игнорирует аргумент позиции и всегда добавляет данные в конец файла.
filehandle.write(buffer[, options])
-
buffer<Buffer>|<TypedArray>|<DataView> -
options<Object> - Возвращает:
<Promise>
Записывает buffer в файл.
Подобно описанной выше функции filehandle.write, эта версия принимает необязательный объект options. Если объект options не указан, используются значения по умолчанию, описанные выше.
filehandle.write(string[, position[, encoding]])
-
string<string> -
position<integer>|<null>Смещение от начала файла, по которому должны быть записаны данные изstring. Еслиpositionне является значениемnumber, данные будут записаны в текущую позицию. Подробнее см. документацию POSIX по функцииpwrite(2). По умолчанию:null -
encoding<string>Ожидаемая кодировка строки. По умолчанию:'utf8' - Возвращает:
<Promise>
Записывает string в файл. Если string не является строкой, промис будет отклонён с ошибкой.
Промис будет выполнен с объектом, содержащим два свойства:
-
bytesWritten<integer>количество записанных байтов -
buffer<string>ссылка на записанное значениеstring.
Небезопасно использовать filehandle.write() несколько раз для одного и того же файла, не дождавшись выполнения (или отклонения) промиса. В этом случае используйте filehandle.createWriteStream().
В Linux позиционная запись не работает, если файл открыт в режиме добавления. Ядро игнорирует аргумент позиции и всегда добавляет данные в конец файла.
filehandle.writeFile(data, options)
-
data<string>|<Buffer>|<TypedArray>|<DataView>|<AsyncIterable>|<Stream> -
options<Object>|<string>-
encoding<string>|<null>Ожидаемая кодировка символов, еслиdataявляется строкой. По умолчанию:'utf8' -
signal<AbortSignal>|<undefined>позволяет прервать выполняющуюся операцию writeFile. По умолчанию:undefined
-
- Возвращает:
<Promise>
Асинхронно записывает данные в файл, заменяя его, если он уже существует. data может быть строкой, буфером, объектом <AsyncIterable> или объектом {Iterable}. При успешном выполнении промис разрешается без аргументов.
Если options является строкой, она указывает encoding.
<FileHandle> должен поддерживать запись.
Небезопасно вызывать filehandle.writeFile() несколько раз для одного и того же файла, не дождавшись разрешения (или отклонения) промиса.
Если для файлового дескриптора выполняется один или несколько вызовов filehandle.write(), а затем вызов filehandle.writeFile(), данные будут записаны с текущей позиции до конца файла. Запись не всегда начинается с начала файла.
filehandle.writev(buffers[, position])
-
buffers<Buffer[]>|<TypedArray[]>|<DataView[]> -
position<integer>|<null>Смещение от начала файла, по которому должны быть записаны данные изbuffers. Еслиpositionне являетсяnumber, данные будут записаны в текущую позицию. По умолчанию:null - Возвращает:
<Promise>
Записывает массив объектов {ArrayBufferView} в файл.
Промис разрешается объектом, содержащим два свойства:
-
bytesWritten<integer>количество записанных байтов -
buffers<Buffer[]>|<TypedArray[]>|<DataView[]>ссылка на входные данныеbuffers.
Небезопасно вызывать writev() несколько раз для одного и того же файла, не дождавшись разрешения (или отклонения) промиса.
В Linux позиционная запись не работает, если файл открыт в режиме добавления. Ядро игнорирует аргумент позиции и всегда добавляет данные в конец файла.
filehandle.writer([options])
Стабильность: 1 — экспериментальный
-
options<Object>-
autoClose<boolean>Закрывать файловый дескриптор после завершения работы средства записи или при ошибке. По умолчанию:false. -
start<number>Смещение в байтах, с которого начинается запись. Если указано, запись выполняется с явным позиционированием. По умолчанию: текущая позиция в файле. -
limit<number>Максимальное количество байтов, принимаемое средством записи. Асинхронные операции записи (write(),writev()), превышающие лимит, отклоняются сERR_OUT_OF_RANGE. Синхронные операции записи (writeSync(),writevSync()) возвращаютfalse. По умолчанию: без ограничений. -
chunkSize<number>Максимальный размер блока в байтах для синхронных операций записи. Запись данных, превышающих этот порог, выполняется асинхронно. Для оптимальной производительностиpipeTo()установите это значение равнымchunkSizeсредства чтения. По умолчанию:131072(128 КБ).
-
- Возвращает:
<Object>-
write(chunk[, options])<Function>Возвращает<Promise>. ПринимаетUint8Array,Bufferили строку (в кодировке UTF-8).-
chunk<Buffer>|<TypedArray>|<DataView>|<string> -
options<Object>-
signal<AbortSignal>Если сигнал уже прерван, запись завершается отказом сAbortErrorбез выполнения операций ввода-вывода.
-
-
-
writev(chunks[, options])<Function>Возвращает<Promise>. Использует scatter/gather-ввод-вывод посредством одного системного вызоваwritev(). Принимает массивы, содержащие какUint8Array, так и строки.-
chunks<Buffer[]>|<TypedArray[]>|<DataView[]>|<string[]> -
options<Object>-
signal<AbortSignal>Если сигнал уже прерван, запись завершается отказом сAbortErrorбез выполнения операций ввода-вывода.
-
-
-
writeSync(chunk)<Function>Возвращает<boolean>. Пытается выполнить синхронную запись. Возвращаетtrue, если запись выполнена успешно, иfalse, если вызывающему коду следует перейти к асинхронной записиwrite(). Возвращаетfalse, если: запись закрыта или находится в состоянии ошибки; выполняется асинхронная операция; размер фрагмента превышаетchunkSizeили запись превыситlimit.-
chunk<Buffer>|<TypedArray>|<DataView>|<string>
-
-
writevSync(chunks)<Function>Возвращает<boolean>. Синхронная пакетная запись. Семантика перехода к резервному варианту такая же, как уwriteSync().-
chunks<Buffer[]>|<TypedArray[]>|<DataView[]>|<string[]>
-
-
end([options])<Function>Возвращает<Promise>, который выполняется с общим числом записанных байтов. Идемпотентен: возвращаетtotalBytesWritten, если запись уже закрыта, и возвращает ожидающий промис, если запись уже закрывается. Отклоняется, если запись находится в состоянии ошибки.-
options<Object>-
signal<AbortSignal>Если сигнал уже прерван,end()отклоняется сAbortError, а запись остается открытой.
-
-
-
endSync()<Function>Возвращает<number>|<number>— общее число записанных байтов при успехе;-1, если запись находится в состоянии ошибки или выполняется асинхронная операция. Идемпотентен, если запись уже закрыта. -
fail(reason)<Function>Переводит запись в конечное состояние ошибки. Выполняется синхронно. Если запись уже закрыта или находится в состоянии ошибки, ничего не делает. ЕслиautoCloseимеет значение true, синхронно закрывает файловый дескриптор.
-
Возвращает записывающий поток node:stream/iter, использующий этот файловый дескриптор.
Запись поддерживает как Symbol.asyncDispose, так и Symbol.dispose:
-
await using w = fh.writer()— если запись все еще открыта (вызовend()еще не выполнен),asyncDisposeвызываетfail(). Еслиend()ожидает завершения, он дожидается этого. -
using w = fh.writer()— безусловно вызываетfail().
Методы writeSync() и writevSync() обеспечивают быстрый путь try-sync, используемый в stream/iter pipeTo(). Если размер фрагмента читателя совпадает с chunkSize записывающего потока, все операции записи в конвейере pipeTo() завершаются синхронно, без затрат на промисы.
Эта функция доступна только при включенном флаге --experimental-stream-iter.
Модули JavaScript
import { open } from 'node:fs/promises';
import { from, pipeTo } from 'node:stream/iter';
import { compressGzip } from 'node:zlib/iter';
// Async pipeline
const fh = await open('output.gz', 'w');
await pipeTo(from('Hello!'), compressGzip(), fh.writer({ autoClose: true }));
// Sync pipeline with limit
const src = await open('input.txt', 'r');
const dst = await open('output.txt', 'w');
const w = dst.writer({ limit: 1024 * 1024 }); // Max 1 MB
await pipeTo(src.pull({ autoClose: true }), w);
await w.end();
await dst.close();
CommonJS
const { open } = require('node:fs/promises');
const { from, pipeTo } = require('node:stream/iter');
const { compressGzip } = require('node:zlib/iter');
async function run() {
// Async pipeline
const fh = await open('output.gz', 'w');
await pipeTo(from('Hello!'), compressGzip(), fh.writer({ autoClose: true }));
// Sync pipeline with limit
const src = await open('input.txt', 'r');
const dst = await open('output.txt', 'w');
const w = dst.writer({ limit: 1024 * 1024 }); // Max 1 MB
await pipeTo(src.pull({ autoClose: true }), w);
await w.end();
await dst.close();
}
run().catch(console.error);
filehandle[Symbol.asyncDispose]()
Вызывает filehandle.close() и возвращает промис, который выполняется после закрытия дескриптора файла.
fsPromises.access(path[, mode])
-
path<string>|<Buffer>|<URL> -
mode<integer>По умолчанию:fs.constants.F_OK - Возвращает:
<Promise>При успешном выполнении возвращаетundefined.
Проверяет разрешения пользователя для файла или каталога, указанного в path. Аргумент mode — необязательное целое число, задающее проверки доступности, которые нужно выполнить. Значением mode должно быть либо fs.constants.F_OK, либо маска, состоящая из побитового ИЛИ любых значений из fs.constants.R_OK, fs.constants.W_OK и fs.constants.X_OK (например, fs.constants.W_OK | fs.constants.R_OK). Возможные значения mode см. в разделе Константы доступа к файлам.
Если проверка доступности выполнена успешно, промис выполняется без значения. Если какая-либо проверка доступности завершается неудачно, промис отклоняется с объектом <Error>. В следующем примере проверяется, можно ли текущему процессу читать файл /etc/passwd и записывать в него.
import { access, constants } from 'node:fs/promises';
try {
await access('/etc/passwd', constants.R_OK | constants.W_OK);
console.log('can access');
} catch {
console.error('cannot access');
}
mjscopy
Не рекомендуется использовать fsPromises.access() для проверки доступности файла перед вызовом fsPromises.open(). Это приводит к состоянию гонки, поскольку другие процессы могут изменить состояние файла между двумя вызовами. Вместо этого пользовательский код должен непосредственно открывать, читать или записывать файл и обрабатывать ошибку, возникающую при отсутствии доступа к файлу.
fsPromises.appendFile(path, data[, options])
-
path<string>|<Buffer>|<URL>|<FileHandle>имя файла или<FileHandle> -
data<string>|<Buffer> -
options<Object>|<string> - Возвращает:
<Promise>При успешном выполнении возвращаетundefined.
Асинхронно добавляет данные в файл, создавая его, если он еще не существует. data может быть строкой или объектом <Buffer>.
Если options является строкой, она задает encoding.
Параметр mode влияет только на вновь созданный файл. Подробнее см. в разделе fs.open().
В качестве path можно указать <FileHandle>, открытый для добавления данных (с помощью fsPromises.open()).
fsPromises.chmod(path, mode)
-
path<string>|<Buffer>|<URL> -
mode<string>|<integer> - Возвращает:
<Promise>При успешном выполнении возвращаетundefined.
Изменяет разрешения файла.
fsPromises.chown(path, uid, gid)
-
path<string>|<Buffer>|<URL> -
uid<integer> -
gid<integer> - Возвращает:
<Promise>При успешном выполнении возвращаетundefined.
Изменяет владельца файла.
fsPromises.copyFile(src, dest[, mode])
-
src<string>|<Buffer>|<URL>имя исходного файла для копирования -
dest<string>|<Buffer>|<URL>имя файла назначения для операции копирования -
mode<integer>Необязательные модификаторы, задающие поведение операции копирования. Можно создать маску, объединив побитовой операцией ИЛИ два или более значений (например,fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE) По умолчанию:0.-
fs.constants.COPYFILE_EXCL: операция копирования завершится ошибкой, еслиdestуже существует. -
fs.constants.COPYFILE_FICLONE: при выполнении операции копирования будет предпринята попытка создать reflink с копированием при записи. Если платформа не поддерживает копирование при записи, будет использован резервный механизм копирования. -
fs.constants.COPYFILE_FICLONE_FORCE: при выполнении операции копирования будет предпринята попытка создать reflink с копированием при записи. Если платформа не поддерживает копирование при записи, операция завершится ошибкой.
-
- Возвращает:
<Promise>При успешном выполнении возвращаетundefined.
Асинхронно копирует src в dest. По умолчанию, если dest уже существует, он перезаписывается.
Атомарность операции копирования не гарантируется. Если ошибка возникнет после открытия файла назначения для записи, будет предпринята попытка удалить файл назначения.
import { copyFile, constants } from 'node:fs/promises';
try {
await copyFile('source.txt', 'destination.txt');
console.log('source.txt was copied to destination.txt');
} catch {
console.error('The file could not be copied');
}
// By using COPYFILE_EXCL, the operation will fail if destination.txt exists.
try {
await copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL);
console.log('source.txt was copied to destination.txt');
} catch {
console.error('The file could not be copied');
}
mjscopy
fsPromises.cp(src, dest[, options])
-
src<string>|<URL>исходный путь для копирования. -
dest<string>|<URL>путь назначения для копирования. -
options<Object>-
dereference<boolean>разыменовывать символические ссылки. По умолчанию:false. -
errorOnExist<boolean>еслиforceимеет значениеfalseи путь назначения существует, выбрасывать ошибку. По умолчанию:false. -
filter<Function>Функция для фильтрации копируемых файлов и каталогов. Возвращаетtrue, чтобы скопировать элемент, иfalse, чтобы пропустить его. При пропуске каталога пропускается и всё его содержимое. Также может возвращатьPromise, который разрешается вtrueилиfalse. По умолчанию:undefined. -
force<boolean>перезаписывать существующий файл или каталог. Если установить значение false и путь назначения существует, операция копирования будет игнорировать ошибки. Используйте параметрerrorOnExist, чтобы изменить это поведение. По умолчанию:true. -
mode<integer>модификаторы операции копирования. По умолчанию:0. См. флагmodeпараметраfsPromises.copyFile(). -
preserveTimestamps<boolean>Если включеноtrue, временные метки изsrcбудут сохранены. По умолчанию:false. -
recursive<boolean>рекурсивно копировать каталоги. По умолчанию:false -
verbatimSymlinks<boolean>Если включеноtrue, разрешение путей для символических ссылок будет пропущено. По умолчанию:false
-
- Возвращает:
<Promise>Выполняется с результатомundefinedв случае успеха.
Асинхронно копирует всю структуру каталогов из src в dest, включая подкаталоги и файлы.
При копировании каталога в другой каталог шаблоны glob не поддерживаются, а поведение аналогично cp dir1/ dir2/.
fsPromises.glob(pattern[, options])
-
pattern<string>|<string[]> -
options<Object>-
cwd<string>|<URL>текущий рабочий каталог. По умолчанию:process.cwd() -
exclude<Function>|<string[]>Функция для фильтрации файлов/каталогов или список шаблонов glob, которые нужно исключить. Если указана функция, вернитеtrue, чтобы исключить элемент, илиfalse, чтобы включить его. По умолчанию:undefined. Если указан массив строк, каждая строка должна быть шаблоном glob, задающим пути для исключения. Примечание: шаблоны отрицания (например, '!foo.js') не поддерживаются. -
followSymlinks<boolean>Еслиtrue, при раскрытии шаблонов**выполняется переход по символьным ссылкам на каталоги. По умолчанию:false. -
withFileTypes<boolean>true, если glob должен возвращать пути в виде Dirent, иfalseв противном случае. По умолчанию:false.
-
- Возвращает:
<AsyncIterator>AsyncIterator, выдающий пути к файлам, соответствующим шаблону.
Если включен followSymlinks, обнаруженные циклы символьных ссылок не обходятся рекурсивно.
Модули JavaScript
import { glob } from 'node:fs/promises';
for await (const entry of glob('**/*.js'))
console.log(entry);
CommonJS
const { glob } = require('node:fs/promises');
(async () => {
for await (const entry of glob('**/*.js'))
console.log(entry);
})();
fsPromises.lchmod(path, mode)
Стабильность: 0 — устаревший
-
path<string>|<Buffer>|<URL> -
mode<integer> - Возвращает:
<Promise>В случае успеха выполняется с результатомundefined.
Изменяет разрешения символьной ссылки.
Этот метод реализован только в macOS.
fsPromises.lchown(path, uid, gid)
-
path<string>|<Buffer>|<URL> -
uid<integer> -
gid<integer> - Возвращает:
<Promise>В случае успеха выполняется с результатомundefined.
Изменяет владельца символьной ссылки.
fsPromises.lutimes(path, atime, mtime)
-
path<string>|<Buffer>|<URL> -
atime<number>|<string>|<Date> -
mtime<number>|<string>|<Date> - Возвращает:
<Promise>В случае успеха выполняется с результатомundefined.
Изменяет время доступа и время изменения файла так же, как fsPromises.utimes(), за исключением того, что если путь указывает на символьную ссылку, она не разыменовывается: вместо этого изменяются временные метки самой символьной ссылки.
fsPromises.link(existingPath, newPath)
-
existingPath<string>|<Buffer>|<URL> -
newPath<string>|<Buffer>|<URL> - Возвращает:
<Promise>При успешном выполнении возвращаетundefined.
Создаёт новую ссылку из existingPath на newPath. Подробнее см. документацию POSIX link(2).
fsPromises.lstat(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>-
bigint<boolean>Определяет, должны ли числовые значения в возвращаемом объекте<fs.Stats>быть типаbigint. По умолчанию:false.
-
- Возвращает:
<Promise>При успешном выполнении возвращает объект<fs.Stats>для указанной символической ссылкиpath.
Эквивалентно fsPromises.stat(), если только path не является символической ссылкой. В этом случае сведения о состоянии запрашиваются для самой ссылки, а не для файла, на который она указывает. Подробнее см. документацию POSIX lstat(2).
fsPromises.mkdir(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>|<integer>-
recursive<boolean>По умолчанию:false -
mode<string>|<integer>Не поддерживается в Windows. Подробнее см. раздел Режимы доступа к файлам. По умолчанию:0o777.
-
- Возвращает:
<Promise>При успешном выполнении возвращаетundefined, еслиrecursiveимеет значениеfalse, или путь к первому созданному каталогу, еслиrecursiveимеет значениеtrue.
Асинхронно создаёт каталог.
Необязательный аргумент options может быть целым числом, задающим mode (права доступа и sticky-биты), либо объектом со свойством mode и свойством recursive, указывающим, следует ли создавать родительские каталоги. Вызов fsPromises.mkdir(), если path — существующий каталог, приводит к отклонению промиса только в том случае, если recursive имеет значение false.
Модули JavaScript
import { mkdir } from 'node:fs/promises';
try {
const projectFolder = new URL('./test/project/', import.meta.url);
const createDir = await mkdir(projectFolder, { recursive: true });
console.log(`created ${createDir}`);
} catch (err) {
console.error(err.message);
}
CommonJS
const { mkdir } = require('node:fs/promises');
const { join } = require('node:path');
async function makeDirectory() {
const projectFolder = join(__dirname, 'test', 'project');
const dirCreation = await mkdir(projectFolder, { recursive: true });
console.log(dirCreation);
return dirCreation;
}
makeDirectory().catch(console.error);
fsPromises.mkdtemp(prefix[, options])
-
prefix<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
- Возвращает:
<Promise>Выполняется со строкой, содержащей путь в файловой системе к только что созданному временному каталогу.
Создает уникальный временный каталог. Уникальное имя каталога генерируется путем добавления шести случайных символов в конец указанного prefix. Из-за различий между платформами не следует использовать завершающие символы X в prefix. Некоторые платформы, в частности BSD, могут возвращать более шести случайных символов и заменять завершающие символы X в prefix случайными символами.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим используемую кодировку символов.
import { mkdtemp } from 'node:fs/promises';
import { join } from 'node:path';
import { tmpdir } from 'node:os';
try {
await mkdtemp(join(tmpdir(), 'foo-'));
} catch (err) {
console.error(err);
}
mjscopy
Метод fsPromises.mkdtemp() добавляет шесть случайно выбранных символов непосредственно к строке prefix. Например, если задан каталог /tmp и предполагается создать временный каталог внутри /tmp, значение prefix должно оканчиваться разделителем пути, специфичным для платформы (require('node:path').sep).
fsPromises.mkdtempDisposable(prefix[, options])
-
prefix<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
- Возвращает:
<Promise>Выполняется с Promise, содержащим асинхронно освобождаемый объект:-
path<string>Путь к созданному каталогу. -
remove<AsyncFunction>Функция, удаляющая созданный каталог. -
[Symbol.asyncDispose]<AsyncFunction>То же, что иremove.
-
Результирующий Promise содержит асинхронно освобождаемый объект, свойство path которого содержит путь к созданному каталогу. При освобождении объекта каталог и его содержимое будут удалены асинхронно, если они все еще существуют. Если удалить каталог не удастся, при освобождении будет выброшена ошибка. У объекта есть асинхронный метод remove(), выполняющий ту же задачу.
Эта функция и функция освобождения результирующего объекта являются асинхронными, поэтому их следует использовать с await + await using, как в await using dir = await fsPromises.mkdtempDisposable('prefix').
Подробные сведения см. в документации к fsPromises.mkdtemp().
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим используемую кодировку символов.
fsPromises.open(path, flags[, mode])
-
path<string>|<Buffer>|<URL> -
flags<string>|<number>См. сведения о поддержкеflagsфайловой системой. По умолчанию:'r'. -
mode<string>|<integer>Задает режим файла (права доступа и биты sticky), если файл создается. Подробнее см. в разделе Режимы файлов. По умолчанию:0o666(доступен для чтения и записи) - Возвращает:
<Promise>Выполняется с объектом<FileHandle>.
Открывает <FileHandle>.
Подробнее см. документацию POSIX для open(2).
Некоторые символы (< > : " / \ | ? *) зарезервированы в Windows, как указано в разделе Именование файлов, путей и пространств имен. В NTFS, если имя файла содержит двоеточие, Node.js откроет поток файловой системы, как описано на этой странице MSDN.
fsPromises.opendir(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>-
encoding<string>|<null>По умолчанию:'utf8' -
bufferSize<number>Количество записей каталога, которые буферизуются во внутренней памяти при чтении каталога. Более высокие значения повышают производительность, но увеличивают потребление памяти. По умолчанию:32 -
recursive<boolean>РазрешенныйDirбудет объектом<AsyncIterable>, содержащим все вложенные файлы и каталоги. По умолчанию:false
-
- Возвращает:
<Promise>Выполняется с объектом<fs.Dir>.
Асинхронно открывает каталог для итеративного сканирования. Подробнее см. документацию POSIX для opendir(3).
Создает объект <fs.Dir>, содержащий все необходимые функции для чтения каталога и его очистки.
Параметр encoding задает кодировку для path при открытии каталога и последующих операциях чтения.
Пример использования асинхронной итерации:
import { opendir } from 'node:fs/promises';
try {
const dir = await opendir('./');
for await (const dirent of dir)
console.log(dirent.name);
} catch (err) {
console.error(err);
}
mjscopy
При использовании асинхронного итератора объект <fs.Dir> автоматически закрывается после завершения работы итератора.
fsPromises.readdir(path[, options])
-
path<string>|<Buffer>|<URL> -
options<string>|<Object> - Возвращает:
<Promise>Выполняется с массивом имен файлов в каталоге, за исключением'.'и'..'.
Читает содержимое каталога.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, указывающим кодировку символов, используемую для имен файлов. Если для encoding задано значение 'buffer', возвращаемые имена файлов будут переданы в виде объектов <Buffer>.
Если для options.withFileTypes задано значение true, возвращаемый массив будет содержать объекты <fs.Dirent>.
import { readdir } from 'node:fs/promises';
try {
const files = await readdir(path);
for (const file of files)
console.log(file);
} catch (err) {
console.error(err);
}
mjscopy
fsPromises.readFile(path[, options])
-
path<string>|<Buffer>|<URL>|<FileHandle>имя файла илиFileHandle -
options<Object>|<string>-
encoding<string>|<null>По умолчанию:null -
flag<string>См. поддержкуflagsфайловой системы. По умолчанию:'r'. -
signal<AbortSignal>позволяет отменить выполняющийся вызов readFile
-
- Возвращает:
<Promise>Выполняется с содержимым файла.
Асинхронно читает всё содержимое файла.
Если кодировка не указана (с помощью options.encoding), данные возвращаются в виде объекта <Buffer>. В противном случае данные будут представлены строкой.
Если options является строкой, она задаёт кодировку.
Если path является каталогом, поведение fsPromises.readFile() зависит от платформы. В macOS, Linux и Windows промис будет отклонён с ошибкой. Во FreeBSD будет возвращено представление содержимого каталога.
Пример чтения файла package.json, расположенного в том же каталоге, что и выполняемый код:
Модули JavaScript
import { readFile } from 'node:fs/promises';
try {
const filePath = new URL('./package.json', import.meta.url);
const contents = await readFile(filePath, { encoding: 'utf8' });
console.log(contents);
} catch (err) {
console.error(err.message);
}
CommonJS
const { readFile } = require('node:fs/promises');
const { resolve } = require('node:path');
async function logFile() {
try {
const filePath = resolve('./package.json');
const contents = await readFile(filePath, { encoding: 'utf8' });
console.log(contents);
} catch (err) {
console.error(err.message);
}
}
logFile();
Выполняющийся запрос readFile можно отменить с помощью <AbortSignal>. Если запрос отменён, возвращённый промис отклоняется с ошибкой AbortError:
import { readFile } from 'node:fs/promises';
try {
const controller = new AbortController();
const { signal } = controller;
const promise = readFile(fileName, { signal });
// Abort the request before the promise settles.
controller.abort();
await promise;
} catch (err) {
// When a request is aborted - err is an AbortError
console.error(err);
}
mjscopy
Отмена выполняющегося запроса не отменяет отдельные запросы операционной системы, а лишь внутреннюю буферизацию, выполняемую fs.readFile.
Указанный <FileHandle> должен поддерживать чтение.
fsPromises.readlink(path[, options])
-
path<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
- Возвращает:
<Promise>При успешном выполнении разрешается значениемlinkString.
Читает содержимое символической ссылки, на которую указывает path. Подробнее см. документацию POSIX readlink(2). При успешном выполнении промис разрешается значением linkString.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим кодировку символов для возвращаемого пути ссылки. Если для encoding задано значение 'buffer', возвращаемый путь ссылки будет передан как объект <Buffer>.
fsPromises.realpath(path[, options])
-
path<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
- Возвращает:
<Promise>При успешном выполнении разрешается разрешённым путём.
Определяет фактическое расположение path, используя ту же семантику, что и функция fs.realpath.native().
Поддерживаются только пути, которые можно преобразовать в строки UTF8.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим кодировку символов для пути. Если для encoding задано значение 'buffer', возвращаемый путь будет передан как объект <Buffer>.
В Linux, если Node.js связан с musl libc, для работы этой функции файловая система procfs должна быть смонтирована в /proc. Для glibc это ограничение отсутствует.
fsPromises.rename(oldPath, newPath)
-
oldPath<string>|<Buffer>|<URL> -
newPath<string>|<Buffer>|<URL> - Возвращает:
<Promise>При успешном выполнении разрешается значениемundefined.
Переименовывает oldPath в newPath.
fsPromises.rmdir(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>В настоящее время параметры не предоставляются. Ранее существовали параметры дляrecursive,maxBusyTriesиemfileWait, но они были объявлены устаревшими и удалены. Аргументoptionsпо-прежнему принимается для обратной совместимости, но не используется. - Возвращает:
<Promise>В случае успеха выполняется с результатомundefined.
Удаляет каталог, указанный в path.
Использование fsPromises.rmdir() для файла (не каталога) приводит к отклонению промиса с ошибкой ENOENT в Windows и ошибкой ENOTDIR в POSIX.
Чтобы добиться поведения, аналогичного Unix-команде rm -rf, используйте fsPromises.rm() с параметрами { recursive: true, force: true }.
fsPromises.rm(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>-
force<boolean>Еслиtrue, исключения будут игнорироваться, еслиpathне существует. По умолчанию:false. -
maxRetries<integer>При возникновении ошибкиEBUSY,EMFILE,ENFILE,ENOTEMPTYилиEPERMNode.js повторит операцию, каждый раз увеличивая время ожидания линейной задержки наretryDelayмиллисекунд. Этот параметр задаёт количество повторных попыток. Он игнорируется, если параметрrecursiveне равенtrue. По умолчанию:0. -
recursive<boolean>Еслиtrue, выполняется рекурсивное удаление каталога. В рекурсивном режиме при сбое операции повторяются. По умолчанию:false. -
retryDelay<integer>Время ожидания между повторными попытками в миллисекундах. Этот параметр игнорируется, если параметрrecursiveне равенtrue. По умолчанию:100.
-
- Возвращает:
<Promise>В случае успеха выполняется с результатомundefined.
Удаляет файлы и каталоги (по аналогии со стандартной утилитой POSIX rm).
fsPromises.stat(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>-
bigint<boolean>Должны ли числовые значения в возвращаемом объекте<fs.Stats>иметь типbigint. По умолчанию:false. -
throwIfNoEntry<boolean>Следует ли выбрасывать исключение, если запись файловой системы не существует, вместо возвратаundefined. По умолчанию:true.
-
- Возвращает:
<Promise>В случае успеха выполняется с объектом<fs.Stats>для указанногоpath.
fsPromises.statfs(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>-
bigint<boolean>Следует ли преобразовать числовые значения в возвращаемом объекте<fs.StatFs>вbigint. По умолчанию:false.
-
- Возвращает:
<Promise>Результатом выполнения будет объект<fs.StatFs>для указанногоpath.
fsPromises.symlink(target, path[, type])
-
target<string>|<Buffer>|<URL> -
path<string>|<Buffer>|<URL> -
type<string>|<null>По умолчанию:null - Возвращает:
<Promise>При успешном выполнении результатом будетundefined.
Создаёт символическую ссылку.
Аргумент type используется только на платформах Windows и может принимать значение 'dir', 'file' или 'junction'. Если аргумент type равен null, Node.js автоматически определит тип target и использует 'file' или 'dir'. Если target не существует, будет использовано 'file'. Для точек соединения Windows путь назначения должен быть абсолютным. При использовании 'junction' аргумент target автоматически будет преобразован в абсолютный путь. Точки соединения на томах NTFS могут указывать только на каталоги.
fsPromises.truncate(path[, len])
-
path<string>|<Buffer>|<URL> -
len<integer>По умолчанию:0 - Возвращает:
<Promise>При успешном выполнении результатом будетundefined.
Усекает (уменьшает или увеличивает длину) содержимое по адресу path до len байт.
fsPromises.unlink(path)
-
path<string>|<Buffer>|<URL> - Возвращает:
<Promise>При успешном выполнении результатом будетundefined.
Если path указывает на символическую ссылку, она удаляется без воздействия на файл или каталог, на который ссылается. Если path указывает на путь к файлу, который не является символической ссылкой, файл удаляется. Подробнее см. в документации POSIX unlink(2).
fsPromises.utimes(path, atime, mtime)
-
path<string>|<Buffer>|<URL> -
atime<number>|<string>|<Date> -
mtime<number>|<string>|<Date> - Возвращает:
<Promise>При успешном выполнении результатом будетundefined.
Изменяет временные метки файловой системы объекта, на который ссылается path.
Для аргументов atime и mtime действуют следующие правила:
- Значениями могут быть числа, представляющие время эпохи Unix, объекты
Dateили числовые строки, например'123456789.0'. - Если значение невозможно преобразовать в число или оно равно
NaN,Infinityили-Infinity, будет выброшено исключениеError.
fsPromises.watch(filename[, options])
-
filename<string>|<Buffer>|<URL> -
options<string>|<Object>-
persistent<boolean>Указывает, должен ли процесс продолжать работу, пока отслеживаются файлы. По умолчанию:true. -
recursive<boolean>Указывает, следует ли отслеживать все подкаталоги или только текущий каталог. Применяется, когда указан каталог, и только на поддерживаемых платформах (см. предостережения). По умолчанию:false. -
encoding<string>Указывает кодировку символов для имени файла, передаваемого слушателю. По умолчанию:'utf8'. -
signal<AbortSignal>Объект<AbortSignal>, используемый для подачи сигнала об остановке наблюдателя. -
maxQueue<number>Указывает количество событий, помещаемых в очередь между итерациями возвращаемого<AsyncIterator>. По умолчанию:2048. -
overflow<string>Либо'ignore', либо'throw', если количество событий, помещаемых в очередь, превышает ограничениеmaxQueue. Значение'ignore'означает, что избыточные события отбрасываются и выводится предупреждение, а'throw'— что выбрасывается исключение. По умолчанию:'ignore'. -
ignore<string>|<RegExp>|<Function>|<Array>Шаблоны, которые нужно игнорировать. Строки являются шаблонами glob (с использованиемminimatch), шаблоны RegExp проверяются на соответствие имени файла, а функции получают имя файла и возвращаютtrue, если его нужно игнорировать. По умолчанию:undefined.
-
- Возвращает:
<AsyncIterator>объектов со свойствами:
Возвращает асинхронный итератор, отслеживающий изменения в filename, где filename — файл или каталог.
const { watch } = require('node:fs/promises');
const ac = new AbortController();
const { signal } = ac;
setTimeout(() => ac.abort(), 10000);
(async () => {
try {
const watcher = watch(__filename, { signal });
for await (const event of watcher)
console.log(event);
} catch (err) {
if (err.name === 'AbortError')
return;
throw err;
}
})();
jscopy
На большинстве платформ событие 'rename' возникает каждый раз, когда имя файла появляется в каталоге или исчезает из него.
Все предостережения, относящиеся к fs.watch(), также применяются к fsPromises.watch().
fsPromises.writeFile(file, data[, options])
-
file<string>|<Buffer>|<URL>|<FileHandle>имя файла илиFileHandle -
data<string>|<Buffer>|<TypedArray>|<DataView>|<AsyncIterable>|<Stream> -
options<Object>|<string>-
encoding<string>|<null>По умолчанию:'utf8' -
mode<integer>По умолчанию:0o666 -
flag<string>См. поддержкуflagsфайловой системы. По умолчанию:'w'. -
flush<boolean>Если все данные успешно записаны в файл иflushимеет значениеtrue, для сброса данных используетсяfilehandle.sync(). По умолчанию:false. -
signal<AbortSignal>позволяет прервать выполняющуюся операцию writeFile
-
- Возвращает:
<Promise>При успешном выполнении разрешается значениемundefined.
Асинхронно записывает данные в файл, заменяя его, если он уже существует. data может быть строкой, буфером, объектом <AsyncIterable> или объектом {Iterable}.
Параметр encoding игнорируется, если data является буфером.
Если options — строка, она задаёт кодировку.
Параметр mode влияет только на вновь созданный файл. Подробнее см. в разделе fs.open().
Указанный <FileHandle> должен поддерживать запись.
Небезопасно использовать fsPromises.writeFile() несколько раз для одного и того же файла, не дожидаясь завершения промиса.
Как и fsPromises.readFile, fsPromises.writeFile — это вспомогательный метод, который внутри выполняет несколько вызовов write для записи переданного ему буфера. Для кода, чувствительного к производительности, рассмотрите возможность использования fs.createWriteStream() или filehandle.createWriteStream().
Для отмены fsPromises.writeFile() можно использовать <AbortSignal>. Отмена выполняется «по возможности», поэтому, вероятно, часть данных всё равно будет записана.
import { writeFile } from 'node:fs/promises';
import { Buffer } from 'node:buffer';
try {
const controller = new AbortController();
const { signal } = controller;
const data = new Uint8Array(Buffer.from('Hello Node.js'));
const promise = writeFile('message.txt', data, { signal });
// Abort the request before the promise settles.
controller.abort();
await promise;
} catch (err) {
// When a request is aborted - err is an AbortError
console.error(err);
}
mjscopy
Прерывание выполняющегося запроса не прерывает отдельные запросы операционной системы, а лишь внутреннюю буферизацию, которую выполняет fs.writeFile.
fsPromises.constants
- Тип:
<Object>
Возвращает объект, содержащий часто используемые константы для операций с файловой системой. Этот объект совпадает с fs.constants. Подробнее см. в разделе Константы FS.
API обратных вызовов
API обратных вызовов выполняют все операции асинхронно, не блокируя цикл событий, а по завершении или при ошибке вызывают функцию обратного вызова.
API обратных вызовов используют внутренний пул потоков Node.js для выполнения операций с файловой системой вне потока цикла событий. Эти операции не синхронизированы и не являются потокобезопасными. При одновременном изменении одного и того же файла необходимо соблюдать осторожность, иначе может произойти повреждение данных.
fs.access(path[, mode], callback)
-
path<string>|<Buffer>|<URL> -
mode<integer>По умолчанию:fs.constants.F_OK -
callback<Function>-
err<Error>
-
Проверяет разрешения пользователя для файла или каталога, указанного в path. Аргумент mode — необязательное целое число, задающее проверки доступности, которые необходимо выполнить. Значением mode должно быть либо fs.constants.F_OK, либо маска, состоящая из побитового ИЛИ любых значений из fs.constants.R_OK, fs.constants.W_OK и fs.constants.X_OK (например, fs.constants.W_OK | fs.constants.R_OK). Возможные значения mode см. в разделе Константы доступа к файлам.
Последний аргумент, callback, — это функция обратного вызова, которая вызывается с возможным аргументом ошибки. Если какая-либо из проверок доступности завершается неудачей, аргументом ошибки будет объект Error. В следующих примерах проверяется, существует ли package.json и доступен ли он для чтения или записи.
import { access, constants } from 'node:fs';
const file = 'package.json';
// Check if the file exists in the current directory.
access(file, constants.F_OK, (err) => {
console.log(`${file} ${err ? 'does not exist' : 'exists'}`);
});
// Check if the file is readable.
access(file, constants.R_OK, (err) => {
console.log(`${file} ${err ? 'is not readable' : 'is readable'}`);
});
// Check if the file is writable.
access(file, constants.W_OK, (err) => {
console.log(`${file} ${err ? 'is not writable' : 'is writable'}`);
});
// Check if the file is readable and writable.
access(file, constants.R_OK | constants.W_OK, (err) => {
console.log(`${file} ${err ? 'is not' : 'is'} readable and writable`);
});
mjscopy
Не используйте fs.access() для проверки доступности файла перед вызовом fs.open(), fs.readFile() или fs.writeFile(). Это приводит к состоянию гонки, поскольку другие процессы могут изменить состояние файла между двумя вызовами. Вместо этого пользовательский код должен напрямую открыть файл, прочитать из него или записать в него и обработать ошибку, возникающую, если файл недоступен.
запись (НЕ РЕКОМЕНДУЕТСЯ)
import { access, open, close } from 'node:fs';
access('myfile', (err) => {
if (!err) {
console.error('myfile already exists');
return;
}
open('myfile', 'wx', (err, fd) => {
if (err) throw err;
try {
writeMyData(fd);
} finally {
close(fd, (err) => {
if (err) throw err;
});
}
});
});
mjscopy
запись (РЕКОМЕНДУЕТСЯ)
import { open, close } from 'node:fs';
open('myfile', 'wx', (err, fd) => {
if (err) {
if (err.code === 'EEXIST') {
console.error('myfile already exists');
return;
}
throw err;
}
try {
writeMyData(fd);
} finally {
close(fd, (err) => {
if (err) throw err;
});
}
});
mjscopy
чтение (НЕ РЕКОМЕНДУЕТСЯ)
import { access, open, close } from 'node:fs';
access('myfile', (err) => {
if (err) {
if (err.code === 'ENOENT') {
console.error('myfile does not exist');
return;
}
throw err;
}
open('myfile', 'r', (err, fd) => {
if (err) throw err;
try {
readMyData(fd);
} finally {
close(fd, (err) => {
if (err) throw err;
});
}
});
});
mjscopy
чтение (РЕКОМЕНДУЕТСЯ)
import { open, close } from 'node:fs';
open('myfile', 'r', (err, fd) => {
if (err) {
if (err.code === 'ENOENT') {
console.error('myfile does not exist');
return;
}
throw err;
}
try {
readMyData(fd);
} finally {
close(fd, (err) => {
if (err) throw err;
});
}
});
mjscopy
Приведённые выше примеры с пометкой «не рекомендуется» проверяют доступность файла, а затем используют его; примеры с пометкой «рекомендуется» лучше, поскольку они используют файл напрямую и обрабатывают возможную ошибку.
В целом проверяйте доступность файла только в том случае, если файл не будет использоваться напрямую, например когда его доступность служит сигналом для другого процесса.
В Windows политики управления доступом (ACL) для каталога могут ограничивать доступ к файлу или каталогу. Однако функция fs.access() не проверяет ACL и поэтому может сообщить, что путь доступен, даже если ACL ограничивает пользователю возможность чтения или записи.
fs.appendFile(path, data[, options], callback)
-
path<string>|<Buffer>|<URL>|<number>имя файла или файловый дескриптор -
data<string>|<Buffer> -
options<Object>|<string> -
callback<Function>-
err<Error>
-
Асинхронно добавляет данные в файл, создавая файл, если он еще не существует. data может быть строкой или <Buffer>.
Параметр mode влияет только на вновь созданный файл. Подробнее см. fs.open().
import { appendFile } from 'node:fs';
appendFile('message.txt', 'data to append', (err) => {
if (err) throw err;
console.log('The "data to append" was appended to file!');
});
mjscopy
Если options является строкой, она задает кодировку:
import { appendFile } from 'node:fs';
appendFile('message.txt', 'data to append', 'utf8', callback);
mjscopy
В качестве path можно указать числовой файловый дескриптор, открытый для добавления данных (с помощью fs.open() или fs.openSync()). Файловый дескриптор не будет закрыт автоматически.
import { open, close, appendFile } from 'node:fs';
function closeFd(fd) {
close(fd, (err) => {
if (err) throw err;
});
}
open('message.txt', 'a', (err, fd) => {
if (err) throw err;
try {
appendFile(fd, 'data to append', 'utf8', (err) => {
closeFd(fd);
if (err) throw err;
});
} catch (err) {
closeFd(fd);
throw err;
}
});
mjscopy
fs.chmod(path, mode, callback)
Асинхронно изменяет права доступа к файлу. В функцию обратного вызова завершения передаются только аргументы, относящиеся к возможной ошибке.
Подробнее см. документацию POSIX по функции chmod(2).
import { chmod } from 'node:fs';
chmod('my_file.txt', 0o775, (err) => {
if (err) throw err;
console.log('The permissions for file "my_file.txt" have been changed!');
});
mjscopyРежимы файлов
Аргумент mode, используемый в методах fs.chmod() и fs.chmodSync(), представляет собой числовую битовую маску, созданную с помощью логического ИЛИ следующих констант:
| Константа | Восьмеричное значение | Описание |
|---|---|---|
fs.constants.S_IRUSR | 0o400 | чтение владельцем |
fs.constants.S_IWUSR | 0o200 | запись владельцем |
fs.constants.S_IXUSR | 0o100 | выполнение/поиск владельцем |
fs.constants.S_IRGRP | 0o40 | чтение группой |
fs.constants.S_IWGRP | 0o20 | запись группой |
fs.constants.S_IXGRP | 0o10 | выполнение/поиск группой |
fs.constants.S_IROTH | 0o4 | чтение другими |
fs.constants.S_IWOTH | 0o2 | запись другими |
fs.constants.S_IXOTH | 0o1 | выполнение/поиск другими |
Более простой способ задать mode — использовать последовательность из трёх восьмеричных цифр (например, 765). Крайняя левая цифра (7 в примере) задаёт разрешения владельца файла. Средняя цифра (6 в примере) задаёт разрешения группы. Крайняя правая цифра (5 в примере) задаёт разрешения для остальных.
| Число | Описание |
|---|---|
7 | чтение, запись и выполнение |
6 | чтение и запись |
5 | чтение и выполнение |
4 | только чтение |
3 | запись и выполнение |
2 | только запись |
1 | только выполнение |
0 | нет разрешений |
Например, восьмеричное значение 0o765 означает:
- Владелец может читать, записывать и выполнять файл.
- Группа может читать и записывать файл.
- Остальные могут читать и выполнять файл.
При использовании обычных чисел там, где ожидаются режимы файлов, любое значение больше 0o777 может привести к зависящему от платформы поведению, для которого не гарантируется единообразная работа. Поэтому такие константы, как S_ISVTX, S_ISGID или S_ISUID, не предоставляются в fs.constants.
Ограничения: в Windows можно изменить только разрешение на запись, а различия между разрешениями для группы, владельца и остальных не реализованы.
fs.chown(path, uid, gid, callback)
Асинхронно изменяет владельца и группу файла. В функцию обратного вызова завершения передаются только возможное исключение и никаких других аргументов.
Дополнительные сведения см. в документации POSIX chown(2).
fs.close(fd[, callback])
-
fd<integer> -
callback<Function>-
err<Error>
-
Закрывает файловый дескриптор. В функцию обратного вызова завершения передаются только возможное исключение и никаких других аргументов.
Вызов fs.close() для любого файлового дескриптора (fd), который в данный момент используется в другой операции fs, может привести к неопределённому поведению.
Дополнительные сведения см. в документации POSIX close(2).
fs.copyFile(src, dest[, mode], callback)
-
src<string>|<Buffer>|<URL>имя исходного файла для копирования -
dest<string>|<Buffer>|<URL>имя файла назначения для операции копирования -
mode<integer>модификаторы операции копирования. По умолчанию:0. -
callback<Function>-
err<Error>
-
Асинхронно копирует src в dest. По умолчанию dest перезаписывается, если уже существует. Функции обратного вызова передаются только аргументы, связанные с возможной ошибкой. Node.js не гарантирует атомарность операции копирования. Если ошибка возникает после открытия файла назначения для записи, Node.js попытается удалить файл назначения.
mode — необязательное целое число, задающее поведение операции копирования. Можно создать маску, выполнив побитовое ИЛИ для двух или более значений (например, fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE).
-
fs.constants.COPYFILE_EXCL: операция копирования завершится ошибкой, еслиdestуже существует. -
fs.constants.COPYFILE_FICLONE: операция копирования попытается создать reflink с копированием при записи. Если платформа не поддерживает копирование при записи, будет использован резервный механизм копирования. -
fs.constants.COPYFILE_FICLONE_FORCE: операция копирования попытается создать reflink с копированием при записи. Если платформа не поддерживает копирование при записи, операция завершится ошибкой.
import { copyFile, constants } from 'node:fs';
function callback(err) {
if (err) throw err;
console.log('source.txt was copied to destination.txt');
}
// destination.txt will be created or overwritten by default.
copyFile('source.txt', 'destination.txt', callback);
// By using COPYFILE_EXCL, the operation will fail if destination.txt exists.
copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL, callback);
mjscopy
fs.cp(src, dest[, options], callback)
-
src<string>|<URL>исходный путь для копирования. -
dest<string>|<URL>путь назначения для копирования. -
options<Object>-
dereference<boolean>разыменовывать символические ссылки. По умолчанию:false. -
errorOnExist<boolean>еслиforceимеет значениеfalse, а путь назначения существует, вызывать ошибку. По умолчанию:false. -
filter<Function>Функция для фильтрации копируемых файлов и каталогов. Возвращаетtrue, чтобы скопировать элемент, илиfalse, чтобы пропустить его. При пропуске каталога пропускается и всё его содержимое. Также может возвращатьPromise, выполняющийся с результатомtrueилиfalse. По умолчанию:undefined. -
force<boolean>перезаписывать существующий файл или каталог. Если задать значение false и путь назначения существует, операция копирования будет игнорировать ошибки. Используйте опциюerrorOnExist, чтобы изменить это поведение. По умолчанию:true. -
mode<integer>модификаторы для операции копирования. По умолчанию:0. См. флагmodeуfs.copyFile(). -
preserveTimestamps<boolean>Еслиtrue, временные метки изsrcбудут сохранены. По умолчанию:false. -
recursive<boolean>рекурсивно копировать каталоги По умолчанию:false -
verbatimSymlinks<boolean>Еслиtrue, разрешение путей для символических ссылок будет пропущено. По умолчанию:false
-
-
callback<Function>-
err<Error>
-
Асинхронно копирует всю структуру каталогов из src в dest, включая подкаталоги и файлы.
При копировании каталога в другой каталог шаблоны glob не поддерживаются, а поведение аналогично cp dir1/ dir2/.
fs.createReadStream(path[, options])
-
path<string>|<Buffer>|<URL> -
options<string>|<Object>-
flags<string>См. поддерживаемые флаги файловой системыflags. По умолчанию:'r'. -
encoding<string>По умолчанию:null -
fd<integer>|<FileHandle>По умолчанию:null -
mode<integer>По умолчанию:0o666 -
autoClose<boolean>По умолчанию:true -
emitClose<boolean>По умолчанию:true -
start<integer> -
end<integer>По умолчанию:Infinity -
highWaterMark<integer>По умолчанию:64 * 1024 -
fs<Object>|<null>По умолчанию:null -
signal<AbortSignal>|<null>По умолчанию:null
-
- Возвращает:
<fs.ReadStream>
options может включать значения start и end, чтобы считывать диапазон байтов из файла, а не весь файл целиком. И start, и end являются включительными и начинают отсчёт с 0; допустимые значения находятся в диапазоне [0, Number.MAX_SAFE_INTEGER]. Если указан fd, а start не задан или равен undefined, fs.createReadStream() считывает данные последовательно с текущей позиции в файле. encoding может принимать любое из значений, допустимых для <Buffer>.
Если указан fd, ReadStream проигнорирует аргумент path и будет использовать указанный файловый дескриптор. Это означает, что событие 'open' не будет сгенерировано. fd должен работать в блокирующем режиме; fd, работающие в неблокирующем режиме, следует передавать в <net.Socket>.
Если fd указывает на символьное устройство, поддерживающее только блокирующее чтение (например, клавиатуру или звуковую карту), операции чтения не завершатся, пока данные не станут доступны. Это может помешать завершению процесса и естественному закрытию потока.
По умолчанию поток генерирует событие 'close' после уничтожения. Установите для параметра emitClose значение false, чтобы изменить это поведение.
С помощью параметра fs можно переопределить соответствующие реализации fs для open, read и close. При указании параметра fs необходимо переопределить read. Если fd не указан, также необходимо переопределить open. Если autoClose имеет значение true, также необходимо переопределить close.
import { createReadStream } from 'node:fs';
// Create a stream from some character device.
const stream = createReadStream('/dev/input/event0');
setTimeout(() => {
stream.close(); // This may not close the stream.
// Artificially marking end-of-stream, as if the underlying resource had
// indicated end-of-file by itself, allows the stream to close.
// This does not cancel pending read operations, and if there is such an
// operation, the process may still not be able to exit successfully
// until it finishes.
stream.push(null);
stream.read(0);
}, 100);
mjscopy
Если autoClose имеет значение false, файловый дескриптор не будет закрыт даже в случае ошибки. Приложение должно самостоятельно закрыть его и убедиться, что утечки файловых дескрипторов не происходит. Если для autoClose установлено значение true (поведение по умолчанию), файловый дескриптор будет автоматически закрыт при 'error' или 'end'.
mode задаёт режим файла (права доступа и бит закрепления), но только если файл был создан.
Пример чтения последних 10 байт файла размером 100 байт:
import { createReadStream } from 'node:fs';
createReadStream('sample.txt', { start: 90, end: 99 });
mjscopy
Если options является строкой, она задаёт кодировку.
fs.createWriteStream(path[, options])
-
path<string>|<Buffer>|<URL> -
options<string>|<Object>-
flags<string>См. поддерживаемые флаги файловой системыflags. По умолчанию:'w'. -
encoding<string>По умолчанию:'utf8' -
fd<integer>|<FileHandle>По умолчанию:null -
mode<integer>По умолчанию:0o666 -
autoClose<boolean>По умолчанию:true -
emitClose<boolean>По умолчанию:true -
start<integer> -
fs<Object>|<null>По умолчанию:null -
signal<AbortSignal>|<null>По умолчанию:null -
highWaterMark<number>По умолчанию:16384 -
flush<boolean>Еслиtrue, базовый файловый дескриптор сбрасывается перед его закрытием. По умолчанию:false.
-
- Возвращает:
<fs.WriteStream>
options может также включать параметр start, позволяющий записывать данные в позицию, расположенную после начала файла; допустимые значения находятся в диапазоне [0, Number.MAX_SAFE_INTEGER]. Для изменения файла, а не его замены, может потребоваться установить параметр flags в значение r+ вместо значения w по умолчанию. encoding может принимать любое из значений, допустимых для <Buffer>.
Если для 'error' или 'finish' установлено значение true (поведение по умолчанию) в autoClose, файловый дескриптор будет закрыт автоматически. Если autoClose имеет значение false, файловый дескриптор не будет закрыт, даже в случае ошибки. Приложение отвечает за его закрытие и предотвращение утечки файловых дескрипторов.
По умолчанию поток генерирует событие 'close' после уничтожения. Чтобы изменить это поведение, установите для параметра emitClose значение false.
С помощью параметра fs можно переопределить соответствующие реализации fs для open, write, writev и close. Переопределение write() без writev() может снизить производительность, поскольку некоторые оптимизации (_writev()) будут отключены. При указании параметра fs требуется переопределить как минимум один из write и writev. Если параметр fd не задан, также требуется переопределение open. Если autoClose равен true, также требуется переопределение close.
Как и <fs.ReadStream>, если указан fd, <fs.WriteStream> проигнорирует аргумент path и будет использовать указанный файловый дескриптор. Это означает, что событие 'open' генерироваться не будет. fd должен быть блокирующим; неблокирующие fd следует передавать в <net.Socket>.
Если options является строкой, она задает кодировку.
fs.exists(path, callback)
Стабильность: 0 — Устарело: вместо этого используйте fs.stat() или fs.access().
-
path<string>|<Buffer>|<URL> -
callback<Function>-
exists<boolean>
-
Проверяет существование элемента по указанному адресу path с помощью файловой системы. Затем вызывает аргумент callback, передавая ему true или false:
import { exists } from 'node:fs';
exists('/etc/passwd', (e) => {
console.log(e ? 'it exists' : 'no passwd!');
});
mjscopy
Параметры этого обратного вызова отличаются от параметров других обратных вызовов Node.js. Обычно первый параметр обратного вызова Node.js — это параметр err, за которым могут следовать другие параметры. Обратный вызов fs.exists() имеет только один логический параметр. Это одна из причин, по которой вместо fs.exists() рекомендуется использовать fs.access().
Если path является символической ссылкой, она обрабатывается. Поэтому, если path существует, но указывает на несуществующий элемент, обратный вызов получит значение false.
Не рекомендуется использовать fs.exists() для проверки существования файла перед вызовом fs.open(), fs.readFile() или fs.writeFile(). Это приводит к состоянию гонки, поскольку другие процессы могут изменить состояние файла между двумя вызовами. Вместо этого пользовательскому коду следует напрямую открыть, прочитать или записать файл и обработать ошибку, возникающую, если файл не существует.
запись (НЕ РЕКОМЕНДУЕТСЯ)
import { exists, open, close } from 'node:fs';
exists('myfile', (e) => {
if (e) {
console.error('myfile already exists');
} else {
open('myfile', 'wx', (err, fd) => {
if (err) throw err;
try {
writeMyData(fd);
} finally {
close(fd, (err) => {
if (err) throw err;
});
}
});
}
});
mjscopy
запись (РЕКОМЕНДУЕТСЯ)
import { open, close } from 'node:fs';
open('myfile', 'wx', (err, fd) => {
if (err) {
if (err.code === 'EEXIST') {
console.error('myfile already exists');
return;
}
throw err;
}
try {
writeMyData(fd);
} finally {
close(fd, (err) => {
if (err) throw err;
});
}
});
mjscopy
чтение (НЕ РЕКОМЕНДУЕТСЯ)
import { open, close, exists } from 'node:fs';
exists('myfile', (e) => {
if (e) {
open('myfile', 'r', (err, fd) => {
if (err) throw err;
try {
readMyData(fd);
} finally {
close(fd, (err) => {
if (err) throw err;
});
}
});
} else {
console.error('myfile does not exist');
}
});
mjscopy
чтение (РЕКОМЕНДУЕТСЯ)
import { open, close } from 'node:fs';
open('myfile', 'r', (err, fd) => {
if (err) {
if (err.code === 'ENOENT') {
console.error('myfile does not exist');
return;
}
throw err;
}
try {
readMyData(fd);
} finally {
close(fd, (err) => {
if (err) throw err;
});
}
});
mjscopy
В приведённых выше примерах «не рекомендуется» сначала проверяется существование файла, а затем файл используется; примеры «рекомендуется» лучше, поскольку в них файл используется напрямую, а возможная ошибка обрабатывается.
Как правило, проверяйте существование файла, только если он не будет использоваться напрямую, например, когда его наличие служит сигналом от другого процесса.
fs.fchmod(fd, mode, callback)
-
fd<integer> -
mode<string>|<integer> -
callback<Function>-
err<Error>
-
Устанавливает разрешения для файла. В обратный вызов завершения передаются только возможная ошибка и никаких других аргументов.
Подробнее см. документацию POSIX по функции fchmod(2).
fs.fchown(fd, uid, gid, callback)
-
fd<integer> -
uid<integer> -
gid<integer> -
callback<Function>-
err<Error>
-
Устанавливает владельца файла. В обратный вызов завершения передаются только возможная ошибка и никаких других аргументов.
Подробнее см. документацию POSIX по функции fchown(2).
fs.fdatasync(fd, callback)
-
fd<integer> -
callback<Function>-
err<Error>
-
Принудительно переводит все поставленные в очередь операции ввода-вывода, связанные с файлом, в состояние завершения синхронного ввода-вывода операционной системы. Подробности см. в документации POSIX fdatasync(2). В обратный вызов завершения передаются только аргументы, кроме возможного исключения.
fs.fstat(fd[, options], callback)
-
fd<integer> -
options<Object>-
bigint<boolean>Определяет, должны ли числовые значения в возвращаемом объекте<fs.Stats>иметь типbigint. По умолчанию:false.
-
-
callback<Function>-
err<Error> -
stats<fs.Stats>
-
Вызывает обратный вызов, передавая ему объект <fs.Stats> для дескриптора файла.
Подробнее см. в документации POSIX fstat(2).
fs.fsync(fd, callback)
-
fd<integer> -
callback<Function>-
err<Error>
-
Запрашивает сброс всех данных для открытого дескриптора файла на устройство хранения. Конкретная реализация зависит от операционной системы и устройства. Подробнее см. в документации POSIX fsync(2). В обратный вызов завершения передаются только аргументы, кроме возможного исключения.
fs.ftruncate(fd[, len], callback)
-
fd<integer> -
len<integer>По умолчанию:0 -
callback<Function>-
err<Error>
-
Усекает файл, на который указывает файловый дескриптор. В обратный вызов завершения передаются только аргументы, содержащие возможную ошибку.
Подробнее см. документацию POSIX ftruncate(2).
Если файл, на который указывает файловый дескриптор, был больше len байт, в файле останутся только первые len байт.
Например, следующая программа оставляет только первые четыре байта файла:
import { open, close, ftruncate } from 'node:fs';
function closeFd(fd) {
close(fd, (err) => {
if (err) throw err;
});
}
open('temp.txt', 'r+', (err, fd) => {
if (err) throw err;
try {
ftruncate(fd, 4, (err) => {
closeFd(fd);
if (err) throw err;
});
} catch (err) {
closeFd(fd);
if (err) throw err;
}
});
mjscopy
Если изначально файл был короче len байт, его размер будет увеличен, а добавленная часть заполнена нулевыми байтами ('\0'):
Если len отрицательно, будет использовано 0.
fs.futimes(fd, atime, mtime, callback)
-
fd<integer> -
atime<number>|<string>|<Date> -
mtime<number>|<string>|<Date> -
callback<Function>-
err<Error>
-
Изменяет временные метки файловой системы объекта, на который указывает предоставленный файловый дескриптор. См. fs.utimes().
fs.glob(pattern[, options], callback)
-
pattern<string>|<string[]> -
options<Object>-
cwd<string>|<URL>текущий рабочий каталог. По умолчанию:process.cwd() -
exclude<Function>|<string[]>Функция для фильтрации файлов/каталогов или список шаблонов glob, которые нужно исключить. Если передана функция, вернитеtrue, чтобы исключить элемент, иfalse, чтобы включить его. По умолчанию:undefined. -
followSymlinks<boolean>Если значениеtrue, при раскрытии шаблонов**выполняется переход по символическим ссылкам на каталоги. По умолчанию:false. -
withFileTypes<boolean>true, если glob должен возвращать пути в виде Dirent, иfalseв противном случае. По умолчанию:false.
-
-
callback<Function>-
err<Error>
-
-
Возвращает файлы, соответствующие указанному шаблону.
Если включен followSymlinks, обнаруженные циклы символических ссылок не обходятся рекурсивно.
Модули JavaScript
import { glob } from 'node:fs';
glob('**/*.js', (err, matches) => {
if (err) throw err;
console.log(matches);
});
CommonJS
const { glob } = require('node:fs');
glob('**/*.js', (err, matches) => {
if (err) throw err;
console.log(matches);
});
fs.lchmod(path, mode, callback)
Стабильность: 0 — устарело
-
path<string>|<Buffer>|<URL> -
mode<integer> -
callback<Function>-
err<Error>|<AggregateError>
-
Изменяет разрешения символической ссылки. Обратному вызову завершения передаются только аргументы, кроме возможного исключения.
Этот метод реализован только в macOS.
Дополнительные сведения см. в документации POSIX lchmod(2).
fs.lchown(path, uid, gid, callback)
Устанавливает владельца символической ссылки. В функцию обратного вызова завершения передаются только возможная ошибка и никакие другие аргументы.
Подробную информацию см. в документации POSIX lchown(2).
fs.lutimes(path, atime, mtime, callback)
-
path<string>|<Buffer>|<URL> -
atime<number>|<string>|<Date> -
mtime<number>|<string>|<Date> -
callback<Function>-
err<Error>
-
Изменяет время доступа и изменения файла так же, как fs.utimes(), за исключением того, что если путь указывает на символическую ссылку, ссылка не разыменовывается: вместо этого изменяются временные метки самой символической ссылки.
В функцию обратного вызова завершения передаются только возможная ошибка и никакие другие аргументы.
fs.link(existingPath, newPath, callback)
-
existingPath<string>|<Buffer>|<URL> -
newPath<string>|<Buffer>|<URL> -
callback<Function>-
err<Error>
-
Создает новую ссылку от existingPath к newPath. Подробную информацию см. в документации POSIX link(2). В функцию обратного вызова завершения передаются только возможная ошибка и никакие другие аргументы.
fs.lstat(path[, options], callback)
-
path<string>|<Buffer>|<URL> -
options<Object>-
bigint<boolean>Определяет, должны ли числовые значения в возвращаемом объекте<fs.Stats>иметь типbigint. По умолчанию:false.
-
-
callback<Function>-
err<Error> -
stats<fs.Stats>
-
Возвращает <fs.Stats> для символической ссылки, на которую указывает путь. Callback получает два аргумента (err, stats), где stats — объект <fs.Stats>. lstat() идентичен stat(), за исключением того, что если path является символической ссылкой, то сведения получаются о самой ссылке, а не о файле, на который она указывает.
Дополнительные сведения см. в документации POSIX для lstat(2).
fs.mkdir(path[, options], callback)
-
path<string>|<Buffer>|<URL> -
options<Object>|<integer>-
recursive<boolean>По умолчанию:false -
mode<string>|<integer>Не поддерживается в Windows. Дополнительные сведения см. в разделе Режимы доступа к файлам. По умолчанию:0o777.
-
-
callback<Function>-
err<Error> -
path<string>|<undefined>Присутствует только в том случае, если каталог создан с параметромrecursive, установленным вtrue.
-
Асинхронно создает каталог.
Callback получает возможное исключение и, если recursive имеет значение true, путь к первому созданному каталогу, (err[, path]). Значение path по-прежнему может быть undefined, когда recursive имеет значение true, если каталог не был создан (например, если он уже существовал).
Необязательный аргумент options может быть целым числом, задающим mode (права доступа и sticky-биты), или объектом со свойством mode и свойством recursive, указывающим, следует ли создавать родительские каталоги. Вызов fs.mkdir(), если path — существующий каталог, приводит к ошибке только тогда, когда recursive равно false. Если recursive равно false и каталог существует, возникает ошибка EEXIST.
import { mkdir } from 'node:fs';
// Create ./tmp/a/apple, regardless of whether ./tmp and ./tmp/a exist.
mkdir('./tmp/a/apple', { recursive: true }, (err) => {
if (err) throw err;
});
mjscopy
В Windows использование fs.mkdir() для корневого каталога даже с рекурсивным созданием приведет к ошибке:
import { mkdir } from 'node:fs';
mkdir('/', { recursive: true }, (err) => {
// => [Error: EPERM: operation not permitted, mkdir 'C:\']
});
mjscopy
Дополнительные сведения см. в документации POSIX для mkdir(2).
fs.mkdtemp(prefix[, options], callback)
-
prefix<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
-
callback<Function>
Создает уникальный временный каталог.
Генерирует шесть случайных символов, которые добавляются к обязательному prefix для создания уникального временного каталога. Из-за различий между платформами не используйте завершающие символы X в prefix. Некоторые платформы, в частности BSD, могут возвращать более шести случайных символов и заменять завершающие символы X в prefix случайными символами.
Путь к созданному каталогу передается в виде строки во втором аргументе callback.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим используемую кодировку символов.
import { mkdtemp } from 'node:fs';
import { join } from 'node:path';
import { tmpdir } from 'node:os';
mkdtemp(join(tmpdir(), 'foo-'), (err, directory) => {
if (err) throw err;
console.log(directory);
// Prints: /tmp/foo-itXde2 or C:\Users\...\AppData\Local\Temp\foo-itXde2
});
mjscopy
Метод fs.mkdtemp() добавляет шесть случайно выбранных символов непосредственно к строке prefix. Например, если задан каталог /tmp и предполагается создать временный каталог внутри /tmp, строка prefix должна оканчиваться разделителем пути, соответствующим платформе (require('node:path').sep).
import { tmpdir } from 'node:os';
import { mkdtemp } from 'node:fs';
// The parent directory for the new temporary directory
const tmpDir = tmpdir();
// This method is *INCORRECT*:
mkdtemp(tmpDir, (err, directory) => {
if (err) throw err;
console.log(directory);
// Will print something similar to `/tmpabc123`.
// A new temporary directory is created at the file system root
// rather than *within* the /tmp directory.
});
// This method is *CORRECT*:
import { sep } from 'node:path';
mkdtemp(`${tmpDir}${sep}`, (err, directory) => {
if (err) throw err;
console.log(directory);
// Will print something similar to `/tmp/abc123`.
// A new temporary directory is created within
// the /tmp directory.
});
mjscopy
fs.open(path[, flags[, mode]], callback)
-
path<string>|<Buffer>|<URL> -
flags<string>|<number>См. поддерживаемые флаги файловой системыflags. По умолчанию:'r'. -
mode<string>|<integer>По умолчанию:0o666(для чтения и записи) -
callback<Function>
Асинхронное открытие файла. Подробнее см. документацию POSIX по open(2).
mode задает режим файла (права доступа и sticky-биты), но только если файл был создан. В Windows можно изменять только разрешение на запись; см. fs.chmod().
Callback получает два аргумента (err, fd).
Некоторые символы (< > : " / \ | ? *) зарезервированы в Windows, как описано в разделе Имена файлов, путей и пространств имен. В NTFS, если имя файла содержит двоеточие, Node.js откроет поток файловой системы, как описано на этой странице MSDN.
Функции, основанные на fs.open(), также ведут себя таким образом: fs.writeFile(), fs.readFile() и т. д.
fs.openAsBlob(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>-
type<string>Необязательный MIME-тип для blob.
-
- Возвращает:
<Promise>При успешном выполнении возвращает<Blob>.
Возвращает <Blob>, данные которого хранятся в указанном файле.
После создания <Blob> файл нельзя изменять. Любые изменения приведут к тому, что чтение данных <Blob> завершится ошибкой DOMException. Для обнаружения изменений данных файла на диске при создании Blob и перед каждым чтением выполняются синхронные операции stat.
Модули JavaScript
import { openAsBlob } from 'node:fs';
const blob = await openAsBlob('the.file.txt');
const ab = await blob.arrayBuffer();
blob.stream();
CommonJS
const { openAsBlob } = require('node:fs');
(async () => {
const blob = await openAsBlob('the.file.txt');
const ab = await blob.arrayBuffer();
blob.stream();
})();
fs.opendir(path[, options], callback)
-
path<string>|<Buffer>|<URL> -
options<Object>-
encoding<string>|<null>По умолчанию:'utf8' -
bufferSize<number>Количество записей каталога, которые буферизуются во внутренней памяти при чтении каталога. Более высокие значения повышают производительность, но увеличивают потребление памяти. По умолчанию:32 -
recursive<boolean>По умолчанию:false
-
-
callback<Function>
Асинхронно открывает каталог. Дополнительные сведения см. в документации POSIX для opendir(3).
Создаёт <fs.Dir>, содержащий все последующие функции для чтения содержимого каталога и очистки ресурсов.
Опция encoding задаёт кодировку для path при открытии каталога и последующих операциях чтения.
fs.read(fd, buffer, offset, length, position, callback)
-
fd<integer> -
buffer<Buffer>|<TypedArray>|<DataView>Буфер, в который будут записаны данные. -
offset<integer>Позиция вbuffer, в которую следует записать данные. -
length<integer>Количество байтов для чтения. -
position<integer>|<bigint>|<null>Указывает, с какого места в файле начать чтение. Еслиpositionравноnullили-1, данные будут прочитаны с текущей позиции в файле, а позиция в файле будет обновлена. Еслиposition— неотрицательное целое число, позиция в файле останется неизменной. -
callback<Function>
Читает данные из файла, указанного в fd.
Обратному вызову передаются три аргумента: (err, bytesRead, buffer).
Если файл не изменяется одновременно, конец файла считается достигнутым, когда число прочитанных байтов равно нулю.
При вызове этого метода в версии, преобразованной с помощью util.promisify(), он возвращает промис для Object со свойствами bytesRead и buffer.
Метод fs.read() читает данные из файла, указанного дескриптором файла (fd). Аргумент length задаёт максимальное число байтов, которое Node.js попытается прочитать из ядра. Однако фактическое число прочитанных байтов (bytesRead) по разным причинам может быть меньше указанного значения length.
Например:
- Если файл короче указанного значения
length, дляbytesReadбудет установлено фактическое число прочитанных байтов. - Если в файле встретится EOF (конец файла) до заполнения буфера, Node.js прочитает все доступные байты до EOF, а параметр
bytesReadв обратном вызове будет содержать фактическое число прочитанных байтов, которое может быть меньше указанного значенияlength. - Если файл находится в медленной сетевой
filesystemили во время чтения возникнет другая проблема, значениеbytesReadможет быть меньше указанного значенияlength.
Поэтому при использовании fs.read() важно проверять значение bytesRead, чтобы определить, сколько байтов действительно было прочитано из файла. В зависимости от логики приложения может потребоваться обработать случаи, когда bytesRead меньше указанного значения length, например обернуть вызов чтения в цикл, если требуется прочитать не меньше определённого количества байтов.
Это поведение аналогично функции POSIX preadv2.
fs.read(fd[, options], callback)
-
fd<integer> -
options<Object>-
buffer<Buffer>|<TypedArray>|<DataView>По умолчанию:Buffer.alloc(16384) -
offset<integer>По умолчанию:0 -
length<integer>По умолчанию:buffer.byteLength - offset -
position<integer>|<bigint>|<null>По умолчанию:null
-
-
callback<Function>
Как и функция fs.read(), эта версия принимает необязательный объект options. Если объект options не указан, по умолчанию используются значения, приведённые выше.
fs.read(fd, buffer[, options], callback)
-
fd<integer> -
buffer<Buffer>|<TypedArray>|<DataView>Буфер, в который будут записаны данные. -
options<Object> -
callback<Function>
Как и функция fs.read(), эта версия принимает необязательный объект options. Если объект options не указан, по умолчанию используются значения, приведённые выше.
fs.readdir(path[, options], callback)
-
path<string>|<Buffer>|<URL> -
options<string>|<Object> -
callback<Function>-
err<Error> -
files<string[]>|<Buffer[]>|<fs.Dirent[]>
-
Считывает содержимое каталога. Обратный вызов получает два аргумента (err, files), где files — это массив имен файлов в каталоге, за исключением '.' и '..'.
Дополнительные сведения см. в документации POSIX для readdir(3).
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим кодировку символов для имен файлов, передаваемых обратному вызову. Если для encoding задано значение 'buffer', возвращаемые имена файлов будут переданы в виде объектов <Buffer>.
Если для options.withFileTypes задано значение true, массив files будет содержать объекты <fs.Dirent>.
fs.readFile(path[, options], callback)
-
path<string>|<Buffer>|<URL>|<integer>имя файла или файловый дескриптор -
options<Object>|<string>-
encoding<string>|<null>По умолчанию:null -
flag<string>См. поддерживаемые флаги файловой системыflags. По умолчанию:'r'. -
signal<AbortSignal>позволяет прервать выполняющуюся операцию readFile
-
-
callback<Function>-
err<Error>|<AggregateError> -
data<string>|<Buffer>
-
Асинхронно считывает всё содержимое файла.
import { readFile } from 'node:fs';
readFile('/etc/passwd', (err, data) => {
if (err) throw err;
console.log(data);
});
mjscopy
Callback получает два аргумента (err, data), где data — это содержимое файла.
Если кодировка не указана, возвращается исходный буфер.
Если options — строка, она задаёт кодировку:
import { readFile } from 'node:fs';
readFile('/etc/passwd', 'utf8', callback);
mjscopy
Если путь указывает на каталог, поведение fs.readFile() и fs.readFileSync() зависит от платформы. В macOS, Linux и Windows будет возвращена ошибка. Во FreeBSD будет возвращено представление содержимого каталога.
import { readFile } from 'node:fs';
// macOS, Linux, and Windows
readFile('<directory>', (err, data) => {
// => [Error: EISDIR: illegal operation on a directory, read <directory>]
});
// FreeBSD
readFile('<directory>', (err, data) => {
// => null, <data>
});
mjscopy
Выполняющийся запрос можно прервать с помощью AbortSignal. При прерывании запроса callback вызывается с AbortError:
import { readFile } from 'node:fs';
const controller = new AbortController();
const signal = controller.signal;
readFile(fileInfo[0].name, { signal }, (err, buf) => {
// ...
});
// When you want to abort the request
controller.abort();
mjscopy
Функция fs.readFile() буферизует весь файл целиком. Чтобы сократить затраты памяти, по возможности используйте потоковую передачу через fs.createReadStream().
Прерывание выполняющегося запроса не прерывает отдельные запросы операционной системы, а лишь внутреннюю буферизацию, которую выполняет fs.readFile.
Файловые дескрипторы
- Указанный файловый дескриптор должен поддерживать чтение.
- Если в качестве
pathуказан файловый дескриптор, он не будет закрыт автоматически. - Чтение начнётся с текущей позиции. Например, если файл уже содержал
'Hello World'и с помощью файлового дескриптора было прочитано шесть байтов, вызовfs.readFile()с тем же файловым дескриптором вернёт'World', а не'Hello World'.
Соображения производительности
Метод fs.readFile() асинхронно считывает содержимое файла в память по одному фрагменту за раз, позволяя циклу событий работать между чтениями фрагментов. Благодаря этому операция чтения меньше влияет на другие задачи, которые могут использовать пул потоков libuv, однако полное считывание файла в память занимает больше времени.
Дополнительные накладные расходы на чтение могут значительно различаться в разных системах и зависят от типа считываемого файла. Если файл не является обычным файлом (например, это канал) и Node.js не может определить его фактический размер, каждая операция чтения загрузит 64 KiB данных. Для обычных файлов при каждом чтении обрабатывается 512 KiB данных.
Если приложению необходимо считывать содержимое файла как можно быстрее, лучше напрямую использовать fs.read() и управлять считыванием всего содержимого файла в коде приложения.
В задаче Node.js на GitHub #25741 приведены дополнительные сведения и подробный анализ производительности fs.readFile() для файлов разных размеров в различных версиях Node.js.
fs.readlink(path[, options], callback)
-
path<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
-
callback<Function>
Читает содержимое символической ссылки, на которую указывает path. Колбэк получает два аргумента (err, linkString).
Дополнительные сведения см. в документации POSIX для readlink(2).
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим кодировку символов для пути ссылки, передаваемого в колбэк. Если для encoding задано значение 'buffer', возвращаемый путь ссылки будет передан как объект <Buffer>.
fs.readv(fd, buffers[, position], callback)
-
fd<integer> -
buffers{ArrayBufferView[]} -
position<integer>|<null>По умолчанию:null -
callback<Function>
Читает данные из файла, указанного в fd, и записывает их в массив ArrayBufferView с помощью readv().
position — это смещение от начала файла, с которого следует читать данные. Если задано typeof position !== 'number', данные будут прочитаны с текущей позиции.
Колбэку будут переданы три аргумента: err, bytesRead и buffers. bytesRead — это количество байтов, прочитанных из файла.
Если вызвать этот метод в его версии, преобразованной с помощью util.promisify(), он возвращает промис для Object со свойствами bytesRead и buffers.
fs.realpath(path[, options], callback)
-
path<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
-
callback<Function>
Асинхронно вычисляет канонический путь, разрешая ., .. и символические ссылки.
Канонический путь не обязательно уникален. Жесткие ссылки и точки монтирования могут предоставлять доступ к объекту файловой системы по множеству путей.
Эта функция работает подобно realpath(3), за некоторыми исключениями:
-
В файловых системах без учета регистра регистр символов не преобразуется.
-
Максимальное число символических ссылок не зависит от платформы и, как правило, значительно превышает число, поддерживаемое собственной реализацией
realpath(3).
Обратный вызов callback получает два аргумента (err, resolvedPath). Для разрешения относительных путей можно использовать process.cwd.
Поддерживаются только пути, которые можно преобразовать в строки UTF8.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, указывающим кодировку символов для пути, передаваемого обратному вызову. Если для encoding задано значение 'buffer', возвращаемый путь будет передан в виде объекта <Buffer>.
Если path разрешается в сокет или канал, функция вернет зависящее от системы имя этого объекта.
Для несуществующего пути возникает ошибка ENOENT. error.path — это абсолютный путь к файлу.
fs.realpath.native(path[, options], callback)
-
path<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
-
callback<Function>
Асинхронный вариант realpath(3).
Обратный вызов callback получает два аргумента (err, resolvedPath).
Поддерживаются только пути, которые можно преобразовать в строки UTF8.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, указывающим кодировку символов для пути, передаваемого обратному вызову. Если для encoding задано значение 'buffer', возвращаемый путь будет передан в виде объекта <Buffer>.
В Linux, если Node.js скомпонован с musl libc, для работы этой функции файловая система procfs должна быть смонтирована в /proc. Для glibc такого ограничения нет.
fs.rename(oldPath, newPath, callback)
-
oldPath<string>|<Buffer>|<URL> -
newPath<string>|<Buffer>|<URL> -
callback<Function>-
err<Error>
-
Асинхронно переименовывает файл по пути oldPath в путь, указанный как newPath. Если newPath уже существует, он будет перезаписан. Если по пути newPath находится каталог, вместо этого будет выдана ошибка. В callback завершения передаются только аргументы, необходимые для возможного исключения.
См. также: rename(2).
import { rename } from 'node:fs';
rename('oldFile.txt', 'newFile.txt', (err) => {
if (err) throw err;
console.log('Rename complete!');
});
mjscopy
fs.rmdir(path[, options], callback)
-
path<string>|<Buffer>|<URL> -
options<Object>В настоящее время нет доступных параметров. Ранее существовали параметрыrecursive,maxBusyTriesиemfileWait, но они устарели и были удалены. Аргументoptionsпо-прежнему принимается для обратной совместимости, но не используется. -
callback<Function>-
err<Error>
-
Асинхронно выполняет rmdir(2). В callback завершения передаются только аргументы, необходимые для возможного исключения.
Использование fs.rmdir() для файла (не каталога) приводит к ошибке ENOENT в Windows и к ошибке ENOTDIR в POSIX.
Чтобы получить поведение, аналогичное команде Unix rm -rf, используйте fs.rm() с параметрами { recursive: true, force: true }.
fs.rm(path[, options], callback)
-
path<string>|<Buffer>|<URL> -
options<Object>-
force<boolean>Еслиtrue, исключения будут игнорироваться, еслиpathне существует. По умолчанию:false. -
maxRetries<integer>При возникновении ошибкиEBUSY,EMFILE,ENFILE,ENOTEMPTYилиEPERMNode.js повторит операцию, увеличивая время ожидания при линейном экспоненциальном откате наretryDelayмиллисекунд с каждой попыткой. Эта опция задаёт количество повторных попыток. Опция игнорируется, если опцияrecursiveне равнаtrue. По умолчанию:0. -
recursive<boolean>Еслиtrue, выполняется рекурсивное удаление. В рекурсивном режиме при сбое операции повторяются. По умолчанию:false. -
retryDelay<integer>Время ожидания между повторными попытками в миллисекундах. Опция игнорируется, если опцияrecursiveне равнаtrue. По умолчанию:100.
-
-
callback<Function>-
err<Error>
-
Асинхронно удаляет файлы и каталоги (работа основана на стандартной утилите POSIX rm). Функция обратного вызова завершения получает аргументы только в случае возможного исключения.
fs.stat(path[, options], callback)
-
path<string>|<Buffer>|<URL> -
options<Object>-
bigint<boolean>Должны ли числовые значения в возвращаемом объекте<fs.Stats>иметь типbigint. По умолчанию:false. -
throwIfNoEntry<boolean>Следует ли выбрасывать исключение, если запись в файловой системе отсутствует, вместо возвратаundefined. По умолчанию:true.
-
-
callback<Function>-
err<Error> -
stats<fs.Stats>
-
Асинхронно выполняет stat(2). Функция обратного вызова получает два аргумента (err, stats), где stats — объект <fs.Stats>.
В случае ошибки err.code будет одной из распространённых системных ошибок.
fs.stat() следует по символическим ссылкам. Используйте fs.lstat(), чтобы получить информацию о самих ссылках.
Не рекомендуется использовать fs.stat() для проверки существования файла перед вызовом fs.open(), fs.readFile() или fs.writeFile(). Вместо этого пользовательскому коду следует напрямую открывать, читать или записывать файл и обрабатывать ошибку, возникающую, если файл недоступен.
Для проверки существования файла без последующих операций с ним рекомендуется использовать fs.access().
Например, при следующей структуре каталогов:
- txtDir -- file.txt - app.js textcopy
Следующая программа проверит статистические данные для указанных путей:
import { stat } from 'node:fs';
const pathsToCheck = ['./txtDir', './txtDir/file.txt'];
for (let i = 0; i < pathsToCheck.length; i++) {
stat(pathsToCheck[i], (err, stats) => {
console.log(stats.isDirectory());
console.log(stats);
});
}
mjscopy
Результат будет выглядеть примерно так:
true
Stats {
dev: 16777220,
mode: 16877,
nlink: 3,
uid: 501,
gid: 20,
rdev: 0,
blksize: 4096,
ino: 14214262,
size: 96,
blocks: 0,
atimeMs: 1561174653071.963,
mtimeMs: 1561174614583.3518,
ctimeMs: 1561174626623.5366,
birthtimeMs: 1561174126937.2893,
atime: 2019-06-22T03:37:33.072Z,
mtime: 2019-06-22T03:36:54.583Z,
ctime: 2019-06-22T03:37:06.624Z,
birthtime: 2019-06-22T03:28:46.937Z,
atimeInstant: 2019-06-22T03:37:33.071963Z,
mtimeInstant: 2019-06-22T03:36:54.5833518Z,
ctimeInstant: 2019-06-22T03:37:06.6235366Z,
birthtimeInstant: 2019-06-22T03:28:46.9372893Z
}
false
Stats {
dev: 16777220,
mode: 33188,
nlink: 1,
uid: 501,
gid: 20,
rdev: 0,
blksize: 4096,
ino: 14214074,
size: 8,
blocks: 8,
atimeMs: 1561174616618.8555,
mtimeMs: 1561174614584,
ctimeMs: 1561174614583.8145,
birthtimeMs: 1561174007710.7478,
atime: 2019-06-22T03:36:56.619Z,
mtime: 2019-06-22T03:36:54.584Z,
ctime: 2019-06-22T03:36:54.584Z,
birthtime: 2019-06-22T03:26:47.711Z,
atimeInstant: 2019-06-22T03:36:56.6188555Z,
mtimeInstant: 2019-06-22T03:36:54.584Z,
ctimeInstant: 2019-06-22T03:36:54.5838145Z,
birthtimeInstant: 2019-06-22T03:26:47.7107478Z
}
consolecopy
fs.statfs(path[, options], callback)
-
path<string>|<Buffer>|<URL> -
options<Object>-
bigint<boolean>Нужно ли преобразовать числовые значения в возвращаемом объекте<fs.StatFs>вbigint. По умолчанию:false.
-
-
callback<Function>-
err<Error> -
stats<fs.StatFs>
-
Асинхронный вызов statfs(2). Возвращает сведения о смонтированной файловой системе, содержащей path. Колбэк получает два аргумента (err, stats), где stats — это объект <fs.StatFs>.
В случае ошибки значение err.code будет одним из распространенных системных ошибок.
fs.symlink(target, path[, type], callback)
-
target<string>|<Buffer>|<URL> -
path<string>|<Buffer>|<URL> -
type<string>|<null>По умолчанию:null -
callback<Function>-
err<Error>
-
Создает ссылку с именем path, указывающую на target. В колбэк завершения передаются только аргументы, связанные с возможным исключением.
Дополнительные сведения см. в документации POSIX по symlink(2).
Аргумент type доступен только в Windows и игнорируется на других платформах. Ему можно задать значение 'dir', 'file' или 'junction'. Если аргумент type имеет значение null, Node.js автоматически определит тип target и использует 'file' или 'dir'. Если target не существует, будет использовано 'file'. Для точек соединения Windows путь назначения должен быть абсолютным. При использовании 'junction' аргумент target автоматически преобразуется в абсолютный путь. Точки соединения на томах NTFS могут указывать только на каталоги.
Относительные пути назначения отсчитываются от родительского каталога ссылки.
import { symlink } from 'node:fs';
symlink('./mew', './mewtwo', callback);
mjscopy
Приведенный выше пример создает символическую ссылку mewtwo, указывающую на mew в том же каталоге:
$ tree . . ├── mew └── mewtwo -> ./mew bashcopy
fs.truncate(path[, len], callback)
-
path<string>|<Buffer>|<URL> -
len<integer>По умолчанию:0 -
callback<Function>-
err<Error>|<AggregateError>
-
Усекает файл. В функцию обратного вызова завершения передаются только аргументы, относящиеся к возможному исключению. В качестве первого аргумента также можно передать файловый дескриптор. В этом случае вызывается fs.ftruncate().
Модули JavaScript
import { truncate } from 'node:fs';
// Assuming that 'path/file.txt' is a regular file.
truncate('path/file.txt', (err) => {
if (err) throw err;
console.log('path/file.txt was truncated');
});
CommonJS
const { truncate } = require('node:fs');
// Assuming that 'path/file.txt' is a regular file.
truncate('path/file.txt', (err) => {
if (err) throw err;
console.log('path/file.txt was truncated');
});
Передача файлового дескриптора устарела и в будущем может привести к возникновению ошибки.
Подробнее см. документацию POSIX по truncate(2).
fs.unlink(path, callback)
-
path<string>|<Buffer>|<URL> -
callback<Function>-
err<Error>
-
Асинхронно удаляет файл или символическую ссылку. В функцию обратного вызова завершения передаются только аргументы, относящиеся к возможному исключению.
import { unlink } from 'node:fs';
// Assuming that 'path/file.txt' is a regular file.
unlink('path/file.txt', (err) => {
if (err) throw err;
console.log('path/file.txt was deleted');
});
mjscopy
fs.unlink() не работает с каталогом, пустым или нет. Чтобы удалить каталог, используйте fs.rmdir().
Подробнее см. документацию POSIX по unlink(2).
fs.unwatchFile(filename[, listener])
-
filename<string>|<Buffer>|<URL> -
listener<Function>Необязательный аргумент — ранее добавленный с помощьюfs.watchFile()обработчик
Прекращает отслеживать изменения filename. Если указано listener, удаляется только этот обработчик. В противном случае удаляются все обработчики, и отслеживание filename фактически прекращается.
Вызов fs.unwatchFile() с именем файла, за изменениями которого не ведётся наблюдение, ничего не делает и не вызывает ошибку.
Использовать fs.watch() эффективнее, чем fs.watchFile() и fs.unwatchFile(). По возможности вместо fs.watchFile() и fs.unwatchFile() следует использовать fs.watch().
fs.utimes(path, atime, mtime, callback)
-
path<string>|<Buffer>|<URL> -
atime<number>|<string>|<Date> -
mtime<number>|<string>|<Date> -
callback<Function>-
err<Error>
-
Изменяет временные метки файловой системы объекта, на который ссылается path.
Аргументы atime и mtime должны соответствовать следующим правилам:
- Значения могут быть числами, представляющими время Unix в секундах с начала эпохи,
Dateами или числовой строкой, например'123456789.0'. - Если значение нельзя преобразовать в число или оно равно
NaN,Infinityили-Infinity, будет выброшено исключениеError.
fs.watch(filename[, options][, listener])
-
filename<string>|<Buffer>|<URL> -
options<string>|<Object>-
persistent<boolean>Указывает, должен ли процесс продолжать работу, пока отслеживаются файлы. По умолчанию:true. -
recursive<boolean>Указывает, следует ли отслеживать все подкаталоги или только текущий каталог. Применяется, если указан каталог, и только на поддерживаемых платформах (см. примечания). По умолчанию:false. -
encoding<string>Задает кодировку символов для имени файла, передаваемого обработчику. По умолчанию:'utf8'. -
signal<AbortSignal>позволяет закрыть наблюдатель с помощью AbortSignal. -
throwIfNoEntry<boolean>Указывает, следует ли выбрасывать исключение, если путь не существует. По умолчанию:true. -
ignore<string>|<RegExp>|<Function>|<Array>Шаблон(ы), исключаемые из обработки. Строки являются glob-шаблонами (с использованиемminimatch), шаблоны RegExp проверяются на соответствие имени файла, а функции получают имя файла и возвращаютtrue, чтобы исключить его из обработки. По умолчанию:undefined.
-
-
listener<Function>|<undefined>По умолчанию:undefined - Возвращает:
<fs.FSWatcher>
Отслеживает изменения в filename, где filename — файл или каталог.
Второй аргумент необязателен. Если options передан в виде строки, он задает encoding. В противном случае следует передать options в виде объекта.
Функция обратного вызова обработчика получает два аргумента (eventType, filename). eventType — это либо 'rename', либо 'change', а filename — имя файла, вызвавшего событие.
На большинстве платформ событие 'rename' генерируется каждый раз, когда имя файла появляется в каталоге или исчезает из него.
Функция обратного вызова обработчика привязана к событию 'change', генерируемому <fs.FSWatcher>, но это не то же самое, что значение 'change' у eventType.
Если передан signal, прерывание соответствующего AbortController закроет возвращенный <fs.FSWatcher>.
Примечания
API fs.watch работает неодинаково на разных платформах и недоступен в некоторых ситуациях.
В Windows события не генерируются, если отслеживаемый каталог перемещен или переименован. При удалении отслеживаемого каталога сообщается об ошибке EPERM.
API fs.watch не обеспечивает защиту от вредоносных действий в файловой системе. Например, в Windows он реализован путем отслеживания изменений в каталоге, а не в отдельных файлах. Это позволяет подменить файл, после чего fs сообщает об изменениях в новом файле с тем же именем.
Доступность
Эта функция зависит от наличия в операционной системе возможности получать уведомления об изменениях файловой системы.
- В системах Linux используется
inotify(7). - В системах BSD используется
kqueue(2). - В macOS для файлов используется
kqueue(2), а для каталогов —FSEvents. - В системах SunOS (включая Solaris и SmartOS) используется
event ports. - В системах Windows эта функция зависит от
ReadDirectoryChangesW. - В системах AIX эта функция зависит от
AHAFS, который должен быть включён. - В системах IBM i эта функция не поддерживается.
Если по какой-либо причине базовая функциональность недоступна, fs.watch() не сможет работать и может вызвать исключение. Например, отслеживание файлов или каталогов может быть ненадёжным, а в некоторых случаях невозможным, в сетевых файловых системах (NFS, SMB и т. д.) или в файловых системах хоста при использовании программ виртуализации, таких как Vagrant или Docker.
По-прежнему можно использовать fs.watchFile(), который выполняет опрос с помощью stat, однако этот метод медленнее и менее надёжен.
Inode
В системах Linux и macOS fs.watch() определяет для пути inode и отслеживает его. Если отслеживаемый путь удалён и создан заново, ему назначается новый inode. Отслеживание выдаст событие удаления, но продолжит следить за исходным inode. События для нового inode выдаваться не будут. Это ожидаемое поведение.
В AIX файлы сохраняют тот же inode на протяжении всего срока существования. Сохранение и закрытие отслеживаемого файла в AIX приведёт к двум уведомлениям (одно — о добавлении нового содержимого, другое — об усечении файла).
Аргумент имени файла
Передача аргумента filename в функцию обратного вызова поддерживается только в Linux, macOS, Windows и AIX. Даже на поддерживаемых платформах наличие filename не всегда гарантируется. Поэтому не следует полагать, что аргумент filename всегда будет передан в функцию обратного вызова; предусмотрите запасную логику на случай, если он null.
import { watch } from 'node:fs';
watch('somedir', (eventType, filename) => {
console.log(`event type is: ${eventType}`);
if (filename) {
console.log(`filename provided: ${filename}`);
} else {
console.log('filename not provided');
}
});
mjscopy
fs.watchFile(filename[, options], listener)
-
filename<string>|<Buffer>|<URL> -
options<Object> -
listener<Function>-
current<fs.Stats> -
previous<fs.Stats>
-
- Возвращает:
<fs.StatWatcher>
Отслеживает изменения в filename. Функция обратного вызова listener будет вызываться каждый раз при обращении к файлу.
Аргумент options можно опустить. Если он указан, это должен быть объект. Объект options может содержать логическое свойство с именем persistent, указывающее, должен ли процесс продолжать работу, пока файлы отслеживаются. В объекте options можно задать свойство interval, определяющее интервал опроса целевого объекта в миллисекундах.
Функция listener получает два аргумента: текущий объект stat и предыдущий объект stat:
import { watchFile } from 'node:fs';
watchFile('message.text', (curr, prev) => {
console.log(`the current mtime is: ${curr.mtime}`);
console.log(`the previous mtime was: ${prev.mtime}`);
});
mjscopy
Эти объекты stat являются экземплярами fs.Stat. Если параметр bigint имеет значение true, числовые значения в этих объектах представлены как BigIntы.
Чтобы получать уведомления об изменении файла, а не только о доступе к нему, необходимо сравнивать curr.mtimeMs и prev.mtimeMs.
Если операция fs.watchFile завершается ошибкой ENOENT, функция-обработчик будет вызвана один раз, причём все поля будут обнулены (а для дат будет указана эпоха Unix). Если позднее файл будет создан, функция-обработчик будет вызвана повторно с последними объектами stat. Это изменение поведения действует начиная с версии v0.10.
Использование fs.watch() эффективнее, чем fs.watchFile и fs.unwatchFile. По возможности вместо fs.watchFile и fs.unwatchFile следует использовать fs.watch.
Если файл, отслеживаемый с помощью fs.watchFile(), исчезает и появляется снова, содержимое previous во втором событии обратного вызова (при повторном появлении файла) будет таким же, как содержимое previous в первом событии обратного вызова (при исчезновении файла).
Это происходит в следующих случаях:
- файл удаляется, а затем восстанавливается
- файл переименовывается, а затем переименовывается ещё раз, возвращая исходное имя
fs.write(fd, buffer, offset[, length[, position]], callback)
-
fd<integer> -
buffer<Buffer>|<TypedArray>|<DataView> -
offset<integer>По умолчанию:0 -
length<integer>По умолчанию:buffer.byteLength - offset -
position<integer>|<null>По умолчанию:null -
callback<Function>-
err<Error> -
bytesWritten<integer> -
buffer<Buffer>|<TypedArray>|<DataView>
-
Записывает buffer в файл, указанный в fd.
offset определяет часть буфера, которую нужно записать, а length — целое число, задающее количество записываемых байтов.
position указывает смещение от начала файла, по которому должны быть записаны эти данные. Если typeof position !== 'number', данные будут записаны в текущую позицию. См. pwrite(2).
Обратному вызову будут переданы три аргумента (err, bytesWritten, buffer), где bytesWritten указывает, сколько байтов было записано из buffer.
При вызове этого метода в виде версии с util.promisify() он возвращает промис для Object со свойствами bytesWritten и buffer.
Небезопасно вызывать fs.write() несколько раз для одного и того же файла, не дожидаясь обратного вызова. В этом случае рекомендуется использовать fs.createWriteStream().
В Linux позиционная запись не работает, если файл открыт в режиме добавления. Ядро игнорирует аргумент позиции и всегда добавляет данные в конец файла.
fs.write(fd, buffer[, options], callback)
-
fd<integer> -
buffer<Buffer>|<TypedArray>|<DataView> -
options<Object> -
callback<Function>-
err<Error> -
bytesWritten<integer> -
buffer<Buffer>|<TypedArray>|<DataView>
-
Записывает buffer в файл, указанный в fd.
Подобно описанной выше функции fs.write, эта версия принимает необязательный объект options. Если объект options не указан, используются значения по умолчанию, приведённые выше.
fs.write(fd, string[, position[, encoding]], callback)
-
fd<integer> -
string<string> -
position<integer>|<null>По умолчанию:null -
encoding<string>По умолчанию:'utf8' -
callback<Function>
Записывает string в файл, указанный параметром fd. Если string не является строкой, выбрасывается исключение.
position указывает смещение от начала файла, по которому следует записать эти данные. Если typeof position !== 'number', данные будут записаны в текущую позицию. См. pwrite(2).
encoding — ожидаемая кодировка строки.
Функция обратного вызова получит аргументы (err, written, string), где written указывает, сколько байтов требуется для записи переданной строки. Количество записанных байтов не обязательно совпадает с количеством записанных символов строки. См. Buffer.byteLength.
Небезопасно вызывать fs.write() несколько раз для одного файла, не дожидаясь выполнения функции обратного вызова. В этом случае рекомендуется использовать fs.createWriteStream().
В Linux позиционная запись не работает, если файл открыт в режиме добавления. Ядро игнорирует аргумент позиции и всегда добавляет данные в конец файла.
В Windows, если файловый дескриптор подключен к консоли (например, fd == 1 или stdout), строка, содержащая символы не из ASCII, по умолчанию будет отображаться некорректно независимо от используемой кодировки. Консоль можно настроить для корректного отображения UTF-8, изменив активную кодовую страницу с помощью команды chcp 65001. Подробнее см. документацию chcp.
fs.writeFile(file, data[, options], callback)
-
file<string>|<Buffer>|<URL>|<integer>имя файла или дескриптор файла -
data<string>|<Buffer>|<TypedArray>|<DataView> -
options<Object>|<string>-
encoding<string>|<null>По умолчанию:'utf8' -
mode<integer>По умолчанию:0o666 -
flag<string>См. поддерживаемые флаги файловой системыflags. По умолчанию:'w'. -
flush<boolean>Если все данные успешно записаны в файл иflushимеет значениеtrue, для сброса данных используетсяfs.fsync(). По умолчанию:false. -
signal<AbortSignal>позволяет прервать выполняющуюся операцию writeFile
-
-
callback<Function>-
err<Error>|<AggregateError>
-
Если file — имя файла, данные асинхронно записываются в файл, заменяя его, если он уже существует. data может быть строкой или буфером.
Если file — дескриптор файла, поведение аналогично прямому вызову fs.write() (который рекомендуется использовать). См. примечания ниже об использовании дескриптора файла.
Параметр encoding игнорируется, если data — буфер.
Параметр mode влияет только на вновь созданный файл. Подробнее см. fs.open().
import { writeFile } from 'node:fs';
import { Buffer } from 'node:buffer';
const data = new Uint8Array(Buffer.from('Hello Node.js'));
writeFile('message.txt', data, (err) => {
if (err) throw err;
console.log('The file has been saved!');
});
mjscopy
Если options — строка, она задаёт кодировку:
import { writeFile } from 'node:fs';
writeFile('message.txt', 'Hello Node.js', 'utf8', callback);
mjscopy
Небезопасно вызывать fs.writeFile() несколько раз для одного и того же файла, не дожидаясь callback. В этом случае рекомендуется использовать fs.createWriteStream().
Как и fs.readFile, fs.writeFile — это вспомогательный метод, который для записи переданного ему буфера выполняет несколько вызовов write. Для кода, чувствительного к производительности, рассмотрите возможность использования fs.createWriteStream().
Для отмены fs.writeFile() можно использовать <AbortSignal>. Отмена выполняется «по возможности», и часть данных, скорее всего, всё равно будет записана.
import { writeFile } from 'node:fs';
import { Buffer } from 'node:buffer';
const controller = new AbortController();
const { signal } = controller;
const data = new Uint8Array(Buffer.from('Hello Node.js'));
writeFile('message.txt', data, { signal }, (err) => {
// When a request is aborted - the callback is called with an AbortError
});
// When the request should be aborted
controller.abort();
mjscopy
Прерывание выполняющегося запроса не прерывает отдельные запросы операционной системы, а лишь внутреннюю буферизацию, выполняемую fs.writeFile.
Использование fs.writeFile() с файловыми дескрипторами
Если file является файловым дескриптором, поведение почти идентично прямому вызову fs.write(), например:
import { write } from 'node:fs';
import { Buffer } from 'node:buffer';
write(fd, Buffer.from(data, options.encoding), callback);
mjscopy
Отличие от прямого вызова fs.write() заключается в том, что при некоторых необычных условиях fs.write() может записать только часть буфера, и для записи оставшихся данных потребуется повторная попытка, тогда как fs.writeFile() повторяет попытки, пока данные не будут записаны полностью (или не произойдет ошибка).
Последствия этого часто становятся причиной путаницы. В случае с файловым дескриптором файл не заменяется! Данные не обязательно записываются в начало файла, а исходные данные файла могут сохраниться до и/или после вновь записанных данных.
Например, если fs.writeFile() вызвать дважды подряд: сначала для записи строки 'Hello', а затем для записи строки ', World', файл будет содержать 'Hello, World', а также может содержать часть исходных данных файла (в зависимости от размера исходного файла и позиции файлового дескриптора). Если бы вместо дескриптора использовалось имя файла, можно было бы гарантировать, что файл будет содержать только ', World'.
fs.writev(fd, buffers[, position], callback)
-
fd<integer> -
buffers{ArrayBufferView[]} -
position<integer>|<null>По умолчанию:null -
callback<Function>
Записывает массив ArrayBufferView в файл, указанный в fd, используя writev().
position — это смещение от начала файла, по которому следует записать эти данные. Если typeof position !== 'number', данные будут записаны в текущую позицию.
Функции обратного вызова будут переданы три аргумента: err, bytesWritten и buffers. bytesWritten — это количество байтов, записанных из buffers.
Если этот метод util.promisify()ен, он возвращает промис для Object со свойствами bytesWritten и buffers.
Небезопасно использовать fs.writev() несколько раз для одного и того же файла, не дожидаясь вызова функции обратного вызова. В этом случае используйте fs.createWriteStream().
В Linux позиционная запись не работает, если файл открыт в режиме добавления. Ядро игнорирует аргумент позиции и всегда добавляет данные в конец файла.
Синхронный API
Синхронные API выполняют все операции синхронно, блокируя цикл событий до завершения операции или возникновения ошибки.
fs.accessSync(path[, mode])
Синхронно проверяет разрешения пользователя для файла или каталога, указанного в path. Аргумент mode — необязательное целое число, задающее проверки доступности, которые необходимо выполнить. mode должен быть либо значением fs.constants.F_OK, либо маской, состоящей из побитового ИЛИ любых значений из fs.constants.R_OK, fs.constants.W_OK и fs.constants.X_OK (например, fs.constants.W_OK | fs.constants.R_OK). Возможные значения mode см. в разделе Константы доступа к файлам.
Если какая-либо из проверок доступности завершится неудачей, будет вызвана ошибка Error. В противном случае метод вернет undefined.
import { accessSync, constants } from 'node:fs';
try {
accessSync('etc/passwd', constants.R_OK | constants.W_OK);
console.log('can read/write');
} catch (err) {
console.error('no access!');
}
mjscopy
fs.appendFileSync(path, data[, options])
-
path<string>|<Buffer>|<URL>|<number>имя файла или дескриптор файла -
data<string>|<Buffer> -
options<Object>|<string>
Синхронно добавляет данные в файл, создавая его, если он ещё не существует. data может быть строкой или <Buffer>.
Параметр mode влияет только на вновь созданный файл. Подробнее см. в разделе fs.open().
import { appendFileSync } from 'node:fs';
try {
appendFileSync('message.txt', 'data to append');
console.log('The "data to append" was appended to file!');
} catch (err) {
/* Handle the error */
}
mjscopy
Если options является строкой, она задаёт кодировку:
import { appendFileSync } from 'node:fs';
appendFileSync('message.txt', 'data to append', 'utf8');
mjscopy
Параметр path может быть задан как числовой дескриптор файла, открытого для добавления данных (с помощью fs.open() или fs.openSync()). Дескриптор файла не будет закрыт автоматически.
import { openSync, closeSync, appendFileSync } from 'node:fs';
let fd;
try {
fd = openSync('message.txt', 'a');
appendFileSync(fd, 'data to append', 'utf8');
} catch (err) {
/* Handle the error */
} finally {
if (fd !== undefined)
closeSync(fd);
}
mjscopy
fs.chmodSync(path, mode)
Подробную информацию см. в документации асинхронной версии этого API: fs.chmod().
Дополнительные сведения см. в документации POSIX для chmod(2).
fs.chownSync(path, uid, gid)
Синхронно изменяет владельца и группу файла. Возвращает undefined. Это синхронная версия fs.chown().
Дополнительные сведения см. в документации POSIX для chown(2).
fs.closeSync(fd)
-
fd<integer>
Закрывает дескриптор файла. Возвращает undefined.
Вызов fs.closeSync() для любого дескриптора файла (fd), который в данный момент используется в какой-либо другой операции fs, может привести к неопределённому поведению.
Дополнительные сведения см. в документации POSIX для close(2).
fs.copyFileSync(src, dest[, mode])
-
src<string>|<Buffer>|<URL>имя исходного файла для копирования -
dest<string>|<Buffer>|<URL>имя файла назначения для операции копирования -
mode<integer>модификаторы операции копирования. По умолчанию:0.
Синхронно копирует src в dest. По умолчанию dest перезаписывается, если уже существует. Возвращает undefined. Node.js не гарантирует атомарность операции копирования. Если ошибка возникает после открытия файла назначения для записи, Node.js попытается удалить файл назначения.
mode — необязательное целое число, задающее поведение операции копирования. Можно создать маску, объединив побитовой операцией ИЛИ два или более значения (например, fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE).
-
fs.constants.COPYFILE_EXCL: операция копирования завершится ошибкой, еслиdestуже существует. -
fs.constants.COPYFILE_FICLONE: операция копирования попытается создать reflink с копированием при записи. Если платформа не поддерживает копирование при записи, будет использован резервный механизм копирования. -
fs.constants.COPYFILE_FICLONE_FORCE: операция копирования попытается создать reflink с копированием при записи. Если платформа не поддерживает копирование при записи, операция завершится ошибкой.
import { copyFileSync, constants } from 'node:fs';
// destination.txt will be created or overwritten by default.
copyFileSync('source.txt', 'destination.txt');
console.log('source.txt was copied to destination.txt');
// By using COPYFILE_EXCL, the operation will fail if destination.txt exists.
copyFileSync('source.txt', 'destination.txt', constants.COPYFILE_EXCL);
mjscopy
fs.cpSync(src, dest[, options])
-
src<string>|<URL>исходный путь для копирования. -
dest<string>|<URL>путь назначения для копирования. -
options<Object>-
dereference<boolean>разыменовывать символические ссылки. По умолчанию:false. -
errorOnExist<boolean>еслиforceимеет значениеfalseи путь назначения существует, выбрасывать ошибку. По умолчанию:false. -
filter<Function>Функция для фильтрации копируемых файлов и каталогов. Возвращайтеtrue, чтобы скопировать элемент, илиfalse, чтобы пропустить его. При пропуске каталога пропускается и всё его содержимое. По умолчанию:undefined -
force<boolean>перезаписывать существующий файл или каталог. Если установить значение false и путь назначения существует, операция копирования будет игнорировать ошибки. Чтобы изменить это поведение, используйте параметрerrorOnExist. По умолчанию:true. -
mode<integer>модификаторы операции копирования. По умолчанию:0. См. флагmodeуfs.copyFileSync(). -
preserveTimestamps<boolean>Еслиtrue, временные метки изsrcбудут сохранены. По умолчанию:false. -
recursive<boolean>рекурсивно копировать каталоги По умолчанию:false -
verbatimSymlinks<boolean>Еслиtrue, разрешение путей для символических ссылок будет пропущено. По умолчанию:false
-
Синхронно копирует всю структуру каталогов из src в dest, включая подкаталоги и файлы.
При копировании каталога в другой каталог glob-шаблоны не поддерживаются; поведение аналогично cp dir1/ dir2/.
fs.existsSync(path)
Возвращает true, если путь существует, и false в противном случае.
Подробную информацию см. в документации по асинхронной версии этого API: fs.exists().
fs.exists() устарел, но fs.existsSync() — нет. Параметр callback для fs.exists() принимает параметры, несовместимые с другими обратными вызовами Node.js. fs.existsSync() не использует обратный вызов.
import { existsSync } from 'node:fs';
if (existsSync('/etc/passwd'))
console.log('The path exists.');
mjscopy
fs.fchmodSync(fd, mode)
Устанавливает права доступа к файлу. Возвращает undefined.
Подробную информацию см. в документации POSIX fchmod(2).
fs.fchownSync(fd, uid, gid)
-
fd<integer> -
uid<integer>Идентификатор пользователя нового владельца файла. -
gid<integer>Идентификатор группы новой группы файла.
Устанавливает владельца файла. Возвращает undefined.
Подробную информацию см. в документации POSIX fchown(2).
fs.fdatasyncSync(fd)
-
fd<integer>
Принудительно переводит все ожидающие операции ввода-вывода, связанные с файлом, в состояние завершения синхронизированного ввода-вывода операционной системы. Подробности см. в документации POSIX fdatasync(2). Возвращает undefined.
fs.fstatSync(fd[, options])
-
fd<integer> -
options<Object>-
bigint<boolean>Указывает, должны ли числовые значения в возвращаемом объекте<fs.Stats>иметь типbigint. По умолчанию:false.
-
- Возвращает:
<fs.Stats>
Получает <fs.Stats> для файлового дескриптора.
Подробную информацию см. в документации POSIX fstat(2).
fs.fsyncSync(fd)
-
fd<integer>
Запрашивает сброс всех данных открытого файлового дескриптора на устройство хранения. Конкретная реализация зависит от операционной системы и устройства. Подробную информацию см. в документации POSIX fsync(2). Возвращает undefined.
fs.ftruncateSync(fd[, len])
Усекает файл, связанный с файловым дескриптором. Возвращает undefined.
Подробную информацию см. в документации по асинхронной версии этого API: fs.ftruncate().
fs.futimesSync(fd, atime, mtime)
Синхронная версия fs.futimes(). Возвращает undefined.
fs.globSync(pattern[, options])
-
pattern<string>|<string[]> -
options<Object>-
cwd<string>|<URL>текущий рабочий каталог. По умолчанию:process.cwd() -
exclude<Function>|<string[]>Функция для фильтрации файлов/каталогов или список шаблонов glob, которые нужно исключить. Если указана функция, вернитеtrue, чтобы исключить элемент, илиfalse, чтобы включить его. По умолчанию:undefined. -
followSymlinks<boolean>Если значениеtrue, символические ссылки на каталоги обрабатываются при раскрытии шаблонов**. По умолчанию:false. -
withFileTypes<boolean>true, если glob должен возвращать пути в виде Dirent, иfalseв противном случае. По умолчанию:false.
-
- Возвращает:
<string[]>пути к файлам, соответствующим шаблону.
Если включён параметр followSymlinks, обнаруженные циклы символических ссылок не обходятся рекурсивно.
Модули JavaScript
import { globSync } from 'node:fs';
console.log(globSync('**/*.js'));
CommonJS
const { globSync } = require('node:fs');
console.log(globSync('**/*.js'));
fs.lchmodSync(path, mode)
Стабильность: 0 — устаревший
Изменяет права доступа к символической ссылке. Возвращает undefined.
Этот метод реализован только в macOS.
Дополнительные сведения см. в документации POSIX для lchmod(2).
fs.lchownSync(path, uid, gid)
-
path<string>|<Buffer>|<URL> -
uid<integer>Идентификатор пользователя нового владельца файла. -
gid<integer>Идентификатор группы новой группы файла.
Устанавливает владельца для указанного пути. Возвращает undefined.
Дополнительные сведения см. в документации POSIX для lchown(2).
fs.lutimesSync(path, atime, mtime)
-
path<string>|<Buffer>|<URL> -
atime<number>|<string>|<Date> -
mtime<number>|<string>|<Date>
Изменяет временные метки файловой системы символической ссылки, на которую указывает path. Возвращает undefined или выбрасывает исключение, если параметры указаны неверно или операция завершается неудачей. Это синхронная версия fs.lutimes().
fs.linkSync(existingPath, newPath)
Создает новую ссылку с existingPath на newPath. Дополнительные сведения см. в документации POSIX для link(2). Возвращает undefined.
fs.lstatSync(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>-
bigint<boolean>Указывает, должны ли числовые значения в возвращаемом объекте<fs.Stats>иметь типbigint. По умолчанию:false. -
throwIfNoEntry<boolean>Указывает, будет ли выброшено исключение, если запись в файловой системе отсутствует, вместо возвратаundefined. По умолчанию:true.
-
- Возвращает:
<fs.Stats>
Получает <fs.Stats> для символической ссылки, на которую указывает path.
Дополнительные сведения см. в документации POSIX для lstat(2).
fs.mkdirSync(path[, options])
Синхронно создаёт каталог. Возвращает undefined или, если recursive имеет значение true, путь к первому созданному каталогу. Это синхронная версия fs.mkdir().
Дополнительные сведения см. в документации POSIX для mkdir(2).
fs.mkdtempSync(prefix[, options])
-
prefix<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
- Возвращает:
<string>
Возвращает путь к созданному каталогу.
Подробные сведения см. в документации асинхронной версии этого API: fs.mkdtemp().
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим используемую кодировку символов.
fs.mkdtempDisposableSync(prefix[, options])
-
prefix<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
- Возвращает:
<Object>Объект, поддерживающий освобождение ресурсов:-
path<string>Путь к созданному каталогу. -
remove<Function>Функция, удаляющая созданный каталог. -
[Symbol.dispose]<Function>То же, что иremove.
-
Возвращает объект, поддерживающий освобождение ресурсов, свойство path которого содержит путь к созданному каталогу. При освобождении ресурсов объекта каталог и его содержимое будут удалены, если они всё ещё существуют. Если каталог не удастся удалить, освобождение ресурсов вызовет ошибку. У объекта есть метод remove(), выполняющий ту же задачу.
Подробные сведения см. в документации для fs.mkdtemp().
Версия этого API с обратным вызовом отсутствует, поскольку API предназначен для использования с синтаксисом using.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим используемую кодировку символов.
fs.opendirSync(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>-
encoding<string>|<null>По умолчанию:'utf8' -
bufferSize<number>Количество записей каталога, которые буферизуются во внутренней памяти при чтении каталога. Более высокие значения обеспечивают лучшую производительность, но требуют больше памяти. По умолчанию:32 -
recursive<boolean>По умолчанию:false
-
- Возвращает:
<fs.Dir>
Синхронно открывает каталог. См. opendir(3).
Создает <fs.Dir>, содержащий все последующие функции для чтения каталога и его очистки.
Параметр encoding задает кодировку для path при открытии каталога и последующих операциях чтения.
fs.openSync(path[, flags[, mode]])
-
path<string>|<Buffer>|<URL> -
flags<string>|<number>По умолчанию:'r'. См. поддержку флагов файловой системыflags. -
mode<string>|<integer>По умолчанию:0o666 - Возвращает:
<number>
Возвращает целое число, представляющее файловый дескриптор.
Подробную информацию см. в документации по асинхронной версии этого API: fs.open().
fs.readdirSync(path[, options])
-
path<string>|<Buffer>|<URL> -
options<string>|<Object> - Возвращает:
<string[]>|<Buffer[]>|<fs.Dirent[]>
Считывает содержимое каталога.
Дополнительные сведения см. в документации POSIX readdir(3).
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, указывающим кодировку символов для имен файлов в возвращаемом результате. Если для encoding задано значение 'buffer', возвращаемые имена файлов будут переданы в виде объектов <Buffer>.
Если для options.withFileTypes задано значение true, результат будет содержать объекты <fs.Dirent>.
fs.readFileSync(path[, options])
-
path<string>|<Buffer>|<URL>|<integer>имя файла или файловый дескриптор -
options<Object>|<string>-
encoding<string>|<null>По умолчанию:null -
flag<string>См. поддерживаемые флаги файловой системыflags. По умолчанию:'r'.
-
- Возвращает:
<string>|<Buffer>
Возвращает содержимое path.
Подробные сведения см. в документации по асинхронной версии этого API: fs.readFile().
Если указан параметр encoding, эта функция возвращает строку. В противном случае она возвращает буфер.
Как и в случае с fs.readFile(), поведение fs.readFileSync() при передаче пути к каталогу зависит от платформы.
import { readFileSync } from 'node:fs';
// macOS, Linux, and Windows
readFileSync('<directory>');
// => [Error: EISDIR: illegal operation on a directory, read <directory>]
// FreeBSD
readFileSync('<directory>'); // => <data>
mjscopy
fs.readlinkSync(path[, options])
-
path<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
- Возвращает:
<string>|<Buffer>
Возвращает строковое значение символической ссылки.
Подробнее см. документацию POSIX readlink(2).
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, указывающим кодировку символов, которую следует использовать для возвращаемого пути ссылки. Если для encoding задано значение 'buffer', возвращаемый путь ссылки будет передан как объект <Buffer>.
fs.readSync(fd, buffer, offset, length[, position])
-
fd<integer> -
buffer<Buffer>|<TypedArray>|<DataView> -
offset<integer> -
length<integer> -
position<integer>|<bigint>|<null>По умолчанию:null - Возвращает:
<number>
Возвращает количество bytesRead.
Подробные сведения см. в документации по асинхронной версии этого API: fs.read().
fs.readSync(fd, buffer[, options])
-
fd<integer> -
buffer<Buffer>|<TypedArray>|<DataView> -
options<Object> - Возвращает:
<number>
Возвращает количество bytesRead.
Подобно описанной выше функции fs.readSync, эта версия принимает необязательный объект options. Если объект options не указан, будут использоваться значения по умолчанию, приведённые выше.
Подробную информацию см. в документации асинхронной версии этого API: fs.read().
fs.readvSync(fd, buffers[, position])
-
fd<integer> -
buffers{ArrayBufferView[]} -
position<integer>|<null>По умолчанию:null - Возвращает:
<number>Количество прочитанных байтов.
Подробную информацию см. в документации асинхронной версии этого API: fs.readv().
fs.realpathSync(path[, options])
-
path<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
- Возвращает:
<string>|<Buffer>
Возвращает разрешённый путь.
Подробную информацию см. в документации асинхронной версии этого API: fs.realpath().
fs.realpathSync.native(path[, options])
-
path<string>|<Buffer>|<URL> -
options<string>|<Object>-
encoding<string>По умолчанию:'utf8'
-
- Возвращает:
<string>|<Buffer>
Синхронный вариант realpath(3).
Поддерживаются только пути, которые можно преобразовать в строки UTF-8.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим кодировку символов для возвращаемого пути. Если для encoding задано значение 'buffer', возвращаемый путь будет передан как объект <Buffer>.
В Linux, если Node.js скомпонован с musl libc, для работы этой функции файловая система procfs должна быть смонтирована в /proc. Для Glibc это ограничение не действует.
fs.renameSync(oldPath, newPath)
Переименовывает файл из oldPath в newPath. Возвращает undefined.
Дополнительные сведения см. в документации POSIX rename(2).
fs.rmdirSync(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>В настоящее время доступные параметры отсутствуют. Ранее существовали параметрыrecursive,maxBusyTriesиemfileWait, но они были объявлены устаревшими и удалены. Аргументoptionsпо-прежнему принимается для обеспечения обратной совместимости, но не используется.
Синхронно выполняет rmdir(2). Возвращает undefined.
Использование fs.rmdirSync() для файла (не каталога) приводит к ошибке ENOENT в Windows и к ошибке ENOTDIR в POSIX.
Чтобы получить поведение, аналогичное поведению команды Unix rm -rf, используйте fs.rmSync() с параметрами { recursive: true, force: true }.
fs.rmSync(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>-
force<boolean>Еслиtrue, исключения будут игнорироваться, еслиpathне существует. По умолчанию:false. -
maxRetries<integer>При возникновении ошибкиEBUSY,EMFILE,ENFILE,ENOTEMPTYилиEPERMNode.js повторит операцию, увеличивая линейную задержку между попытками наretryDelayмиллисекунд. Этот параметр задаёт количество повторных попыток. Параметр игнорируется, если параметрrecursiveне равенtrue. По умолчанию:0. -
recursive<boolean>Еслиtrue, выполняется рекурсивное удаление каталога. В рекурсивном режиме при сбое операций выполняются повторные попытки. По умолчанию:false. -
retryDelay<integer>Время ожидания между повторными попытками в миллисекундах. Этот параметр игнорируется, если параметрrecursiveне равенtrue. По умолчанию:100.
-
Синхронно удаляет файлы и каталоги (по образцу стандартной утилиты POSIX rm). Возвращает undefined.
fs.statSync(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>-
bigint<boolean>Следует ли возвращать числовые значения в объекте<fs.Stats>какbigint. По умолчанию:false. -
throwIfNoEntry<boolean>Следует ли генерировать исключение, если запись в файловой системе не существует, вместо возвратаundefined. По умолчанию:true.
-
- Возвращает:
<fs.Stats>
Получает <fs.Stats> для указанного пути.
fs.statfsSync(path[, options])
-
path<string>|<Buffer>|<URL> -
options<Object>-
bigint<boolean>Следует ли возвращать числовые значения в объекте<fs.StatFs>какbigint. По умолчанию:false.
-
- Возвращает:
<fs.StatFs>
Синхронный вызов statfs(2). Возвращает информацию о смонтированной файловой системе, содержащей path.
В случае ошибки значение err.code будет одним из общих системных ошибок.
fs.symlinkSync(target, path[, type])
-
target<string>|<Buffer>|<URL> -
path<string>|<Buffer>|<URL> -
type<string>|<null>По умолчанию:null - Возвращает:
undefined.
Подробную информацию см. в документации по асинхронной версии этого API: fs.symlink().
fs.truncateSync(path[, len])
Обрезает файл. Возвращает undefined. В качестве первого аргумента также можно передать файловый дескриптор. В этом случае вызывается fs.ftruncateSync().
Передача файлового дескриптора устарела и в будущем может привести к генерации ошибки.
fs.unlinkSync(path)
Синхронный вызов unlink(2). Возвращает undefined.
fs.utimesSync(path, atime, mtime)
-
path<string>|<Buffer>|<URL> -
atime<number>|<string>|<Date> -
mtime<number>|<string>|<Date> - Возвращает:
undefined.
Подробную информацию см. в документации асинхронной версии этого API: fs.utimes().
fs.writeFileSync(file, data[, options])
-
file<string>|<Buffer>|<URL>|<integer>имя файла или дескриптор файла -
data<string>|<Buffer>|<TypedArray>|<DataView> -
options<Object>|<string> - Возвращает:
undefined.
Параметр mode влияет только на вновь созданный файл. Дополнительные сведения см. в разделе fs.open().
Подробную информацию см. в документации асинхронной версии этого API: fs.writeFile().
fs.writeSync(fd, buffer, offset[, length[, position]])
-
fd<integer> -
buffer<Buffer>|<TypedArray>|<DataView> -
offset<integer>По умолчанию:0 -
length<integer>По умолчанию:buffer.byteLength - offset -
position<integer>|<null>По умолчанию:null - Возвращает:
<number>Количество записанных байтов.
Подробную информацию см. в документации асинхронной версии этого API: fs.write(fd, buffer...).
fs.writeSync(fd, buffer[, options])
-
fd<integer> -
buffer<Buffer>|<TypedArray>|<DataView> -
options<Object> - Возвращает:
<number>Количество записанных байтов.
Подробную информацию см. в документации асинхронной версии этого API: fs.write(fd, buffer...).
fs.writeSync(fd, string[, position[, encoding]])
-
fd<integer> -
string<string> -
position<integer>|<null>По умолчанию:null -
encoding<string>По умолчанию:'utf8' - Возвращает:
<number>Количество записанных байтов.
Подробную информацию см. в документации асинхронной версии этого API: fs.write(fd, string...).
fs.writevSync(fd, buffers[, position])
-
fd<integer> -
buffers{ArrayBufferView[]} -
position<integer>|<null>По умолчанию:null - Возвращает:
<number>Количество записанных байтов.
Подробную информацию см. в документации асинхронной версии этого API: fs.writev().
Общие объекты
Общие объекты используются всеми вариантами API файловой системы (на основе промисов, с обратным вызовом и синхронным).
Класс: fs.Dir
Класс, представляющий поток каталога.
Создается с помощью fs.opendir(), fs.opendirSync() или fsPromises.opendir().
import { opendir } from 'node:fs/promises';
try {
const dir = await opendir('./');
for await (const dirent of dir)
console.log(dirent.name);
} catch (err) {
console.error(err);
}
mjscopy
При использовании асинхронного итератора объект <fs.Dir> будет автоматически закрыт после завершения итерации.
dir.close()
- Возвращает:
<Promise>
Асинхронно закрывает дескриптор базового ресурса каталога. Последующие чтения приведут к ошибкам.
Возвращается промис, который будет выполнен после закрытия ресурса.
dir.close(callback)
-
callback<Function>-
err<Error>
-
Асинхронно закрывает дескриптор базового ресурса каталога. Последующие чтения приведут к ошибкам.
callback будет вызван после закрытия дескриптора ресурса.
dir.closeSync()
Синхронно закрывает дескриптор базового ресурса каталога. Последующие чтения приведут к ошибкам.
dir.path
- Тип:
<string>
Путь этого каталога, доступный только для чтения, который был передан в fs.opendir(), fs.opendirSync() или fsPromises.opendir().
dir.read()
- Возвращает:
<Promise>Выполняется с объектом<fs.Dirent>|<null>
Асинхронно считывает следующую запись каталога посредством readdir(3) как объект <fs.Dirent>.
Возвращается промис, который будет выполнен с объектом <fs.Dirent> или null, если записей каталога для чтения больше нет.
Записи каталога, возвращаемые этой функцией, не имеют определенного порядка и располагаются так, как их предоставляет базовый механизм каталогов операционной системы. Записи, добавленные или удаленные во время итерации по каталогу, могут не попасть в результаты итерации.
dir.read(callback)
-
callback<Function>-
err<Error> -
dirent<fs.Dirent>|<null>
-
Асинхронно считывает следующую запись каталога посредством readdir(3) как объект <fs.Dirent>.
После завершения чтения будет вызван callback с объектом <fs.Dirent> или null, если записей каталога для чтения больше нет.
Записи каталога, возвращаемые этой функцией, не имеют определенного порядка и располагаются так, как их предоставляет базовый механизм каталогов операционной системы. Записи, добавленные или удаленные во время итерации по каталогу, могут не попасть в результаты итерации.
dir.readSync()
- Возвращает:
<fs.Dirent>|<null>
Синхронно считывает следующую запись каталога как объект <fs.Dirent>. Подробнее см. документацию POSIX по readdir(3).
Если записей каталога для чтения больше нет, будет возвращено null.
Записи каталога, возвращаемые этой функцией, не имеют определенного порядка и располагаются так, как их предоставляет базовый механизм каталогов операционной системы. Записи, добавленные или удаленные во время итерации по каталогу, могут не попасть в результаты итерации.
dir[Symbol.asyncIterator]()
- Возвращает:
<AsyncIterator>асинхронный итератор объектов<fs.Dirent>
Асинхронно перебирает каталог до тех пор, пока не будут считаны все записи. Подробнее см. документацию POSIX по readdir(3).
Записи, возвращаемые асинхронным итератором, всегда являются объектами <fs.Dirent>. Случай null из dir.read() обрабатывается внутри.
Пример см. в разделе <fs.Dir>.
Записи каталога, возвращаемые этим итератором, не имеют определенного порядка и располагаются так, как их предоставляет базовый механизм каталогов операционной системы. Записи, добавленные или удаленные во время итерации по каталогу, могут не попасть в результаты итерации.
dir[Symbol.asyncDispose]()
Вызывает dir.close(), если дескриптор каталога открыт, и возвращает промис, который выполняется после завершения освобождения ресурсов.
dir[Symbol.dispose]()
Вызывает dir.closeSync(), если дескриптор каталога открыт, и возвращает undefined.
Класс: fs.Dirent
Представление записи каталога, которой может быть файл или подкаталог внутри каталога, возвращаемое при чтении из <fs.Dir>. Запись каталога представляет собой сочетание имени файла и его типа.
Кроме того, если fs.readdir() или fs.readdirSync() вызывается с параметром withFileTypes, установленным в true, результирующий массив заполняется объектами <fs.Dirent>, а не строками или объектами <Buffer>.
dirent.isBlockDevice()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Dirent> описывает блочное устройство.
dirent.isCharacterDevice()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Dirent> описывает символьное устройство.
dirent.isDirectory()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Dirent> описывает каталог файловой системы.
dirent.isFIFO()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Dirent> описывает канал FIFO (первым вошёл — первым вышел).
dirent.isFile()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Dirent> описывает обычный файл.
dirent.isSocket()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Dirent> описывает сокет.
dirent.isSymbolicLink()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Dirent> описывает символическую ссылку.
dirent.name
Имя файла, на который ссылается этот объект <fs.Dirent>. Тип этого значения определяется параметром options.encoding, переданным в fs.readdir() или fs.readdirSync().
dirent.parentPath
- Тип:
<string>
Путь к родительскому каталогу файла, на который ссылается этот объект <fs.Dirent>.
Класс: fs.FSWatcher
- Расширяет
<EventEmitter>
Успешный вызов метода fs.watch() вернёт новый объект <fs.FSWatcher>.
Все объекты <fs.FSWatcher> генерируют событие 'change' при изменении конкретного отслеживаемого файла.
Событие: 'change'
-
eventType<string>Тип произошедшего события изменения -
filename<string>|<Buffer>Имя изменившегося файла (если применимо или доступно)
Генерируется при изменении чего-либо в отслеживаемом каталоге или файле. Подробнее см. в разделе fs.watch().
Аргумент filename может не предоставляться в зависимости от поддержки операционной системы. Если filename предоставлен, он будет передан как <Buffer>, если fs.watch() вызван с параметром encoding, установленным в 'buffer'; в противном случае filename будет строкой в кодировке UTF-8.
import { watch } from 'node:fs';
// Example when handled through fs.watch() listener
watch('./tmp', { encoding: 'buffer' }, (eventType, filename) => {
if (filename) {
console.log(filename);
// Prints: <Buffer ...>
}
});
mjscopyСобытие: 'close'
Генерируется, когда наблюдатель прекращает отслеживать изменения. Закрытый объект <fs.FSWatcher> больше нельзя использовать в обработчике события.
Событие: 'error'
-
error<Error>
Генерируется при возникновении ошибки во время наблюдения за файлом. Объект <fs.FSWatcher>, в котором произошла ошибка, больше нельзя использовать в обработчике события.
watcher.close()
Прекращает отслеживание изменений для указанного объекта <fs.FSWatcher>. После остановки объект <fs.FSWatcher> больше нельзя использовать.
watcher.ref()
- Возвращает:
<fs.FSWatcher>
При вызове запрашивает, чтобы цикл событий Node.js не завершался, пока активен объект <fs.FSWatcher>. Повторные вызовы watcher.ref() не повлияют на результат.
По умолчанию для всех объектов <fs.FSWatcher> включена ссылка («ref'ed»), поэтому обычно нет необходимости вызывать watcher.ref(), если ранее не был вызван watcher.unref().
watcher.unref()
- Возвращает:
<fs.FSWatcher>
При вызове активному объекту <fs.FSWatcher> больше не требуется, чтобы цикл событий Node.js оставался активным. Если нет других задач, поддерживающих работу цикла событий, процесс может завершиться до вызова обратного вызова объекта <fs.FSWatcher>. Повторные вызовы watcher.unref() не повлияют на результат.
Класс: fs.StatWatcher
- Расширяет
<EventEmitter>
При успешном вызове метода fs.watchFile() возвращается новый объект <fs.StatWatcher>.
watcher.ref()
- Возвращает:
<fs.StatWatcher>
При вызове запрашивает, чтобы цикл событий Node.js не завершался, пока активен объект <fs.StatWatcher>. Повторные вызовы watcher.ref() не повлияют на результат.
По умолчанию для всех объектов <fs.StatWatcher> включена ссылка («ref'ed»), поэтому обычно нет необходимости вызывать watcher.ref(), если ранее не был вызван watcher.unref().
watcher.unref()
- Возвращает:
<fs.StatWatcher>
При вызове активному объекту <fs.StatWatcher> больше не требуется, чтобы цикл событий Node.js оставался активным. Если нет других задач, поддерживающих работу цикла событий, процесс может завершиться до вызова обратного вызова объекта <fs.StatWatcher>. Повторные вызовы watcher.unref() не повлияют на результат.
Класс: fs.ReadStream
- Расширяет:
<stream.Readable>
Экземпляры <fs.ReadStream> нельзя создать напрямую. Они создаются и возвращаются функцией fs.createReadStream().
Событие: 'close'
Генерируется после закрытия базового файлового дескриптора объекта <fs.ReadStream>.
Событие: 'open'
-
fd<integer>Целочисленный файловый дескриптор, используемый объектом<fs.ReadStream>.
Генерируется после открытия файлового дескриптора объекта <fs.ReadStream>.
Событие: 'ready'
Генерируется, когда объект <fs.ReadStream> готов к использованию.
Срабатывает сразу после 'open'.
readStream.bytesRead
- Тип:
<number>
Количество байтов, считанных на данный момент.
readStream.path
Путь к файлу, из которого поток считывает данные, как указано в первом аргументе fs.createReadStream(). Если path передан как строка, то readStream.path будет строкой. Если path передан как <Buffer>, то readStream.path будет <Buffer>. Если указан fd, то readStream.path будет undefined.
readStream.pending
- Тип:
<boolean>
Это свойство имеет значение true, если файл ещё не был открыт, то есть до вызова события 'ready'.
Класс: fs.Stats
Объект <fs.Stats> предоставляет сведения о файле.
Объекты, возвращаемые методами fs.stat(), fs.lstat(), fs.fstat() и их синхронными аналогами, имеют этот тип. Если параметр bigint в объекте options, переданном этим методам, имеет значение true, числовые значения будут представлены типом bigint вместо number, а объект будет содержать дополнительные свойства с точностью до наносекунд и суффиксом Ns. Объекты Stat не следует создавать напрямую с помощью ключевого слова new.
Stats {
dev: 2114,
ino: 48064969,
mode: 33188,
nlink: 1,
uid: 85,
gid: 100,
rdev: 0,
size: 527,
blksize: 4096,
blocks: 8,
atimeMs: 1318289051000.1,
mtimeMs: 1318289051000.1,
ctimeMs: 1318289051000.1,
birthtimeMs: 1318289051000.1,
// Instances of Date
atime: Mon, 10 Oct 2011 23:24:11 GMT,
mtime: Mon, 10 Oct 2011 23:24:11 GMT,
ctime: Mon, 10 Oct 2011 23:24:11 GMT,
birthtime: Mon, 10 Oct 2011 23:24:11 GMT,
// Instances of Temporal.Instant
atimeInstant: 2011-10-10T23:24:11.0001Z,
mtimeInstant: 2011-10-10T23:24:11.0001Z,
ctimeInstant: 2011-10-10T23:24:11.0001Z,
birthtimeInstant: 2011-10-10T23:24:11.0001Z
}
consolecopy
Версия bigint:
BigIntStats {
dev: 2114n,
ino: 48064969n,
mode: 33188n,
nlink: 1n,
uid: 85n,
gid: 100n,
rdev: 0n,
size: 527n,
blksize: 4096n,
blocks: 8n,
atimeMs: 1318289051000n,
mtimeMs: 1318289051000n,
ctimeMs: 1318289051000n,
birthtimeMs: 1318289051000n,
atimeNs: 1318289051000000000n,
mtimeNs: 1318289051000000000n,
ctimeNs: 1318289051000000000n,
birthtimeNs: 1318289051000000000n,
// Instances of Date
atime: Mon, 10 Oct 2011 23:24:11 GMT,
mtime: Mon, 10 Oct 2011 23:24:11 GMT,
ctime: Mon, 10 Oct 2011 23:24:11 GMT,
birthtime: Mon, 10 Oct 2011 23:24:11 GMT,
// Instances of Temporal.Instant
atimeInstant: 2011-10-10T23:24:11Z,
mtimeInstant: 2011-10-10T23:24:11Z,
ctimeInstant: 2011-10-10T23:24:11Z,
birthtimeInstant: 2011-10-10T23:24:11Z
}
consolecopy
stats.isBlockDevice()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Stats> описывает блочное устройство.
stats.isCharacterDevice()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Stats> описывает символьное устройство.
stats.isDirectory()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Stats> описывает каталог файловой системы.
Если объект <fs.Stats> получен в результате вызова fs.lstat() для символической ссылки, указывающей на каталог, этот метод вернёт false. Это связано с тем, что fs.lstat() возвращает сведения о самой символической ссылке, а не о пути, на который она указывает.
stats.isFIFO()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Stats> описывает канал FIFO (первым пришёл — первым ушёл).
stats.isFile()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Stats> описывает обычный файл.
stats.isSocket()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Stats> описывает сокет.
stats.isSymbolicLink()
- Возвращает:
<boolean>
Возвращает true, если объект <fs.Stats> описывает символическую ссылку.
Этот метод действителен только при использовании fs.lstat().
stats.dev
Числовой идентификатор устройства, содержащего файл.
stats.ino
Номер «inode» файла, специфичный для файловой системы.
stats.mode
Битовая маска, описывающая тип и режим файла.
stats.nlink
Количество жестких ссылок на файл.
stats.uid
Числовой идентификатор пользователя, которому принадлежит файл (POSIX).
stats.gid
Числовой идентификатор группы, которой принадлежит файл (POSIX).
stats.rdev
Числовой идентификатор устройства, если файл представляет собой устройство.
stats.size
Размер файла в байтах.
Если базовая файловая система не поддерживает получение размера файла, это значение будет 0.
stats.blksize
Размер блока файловой системы для операций ввода-вывода.
stats.blocks
Количество блоков, выделенных для этого файла.
stats.atimeMs
Метка времени последнего доступа к этому файлу, выраженная в миллисекундах с начала эпохи POSIX.
stats.mtimeMs
Метка времени последнего изменения этого файла, выраженная в миллисекундах с начала эпохи POSIX.
stats.ctimeMs
Метка времени последнего изменения состояния файла, выраженная в миллисекундах с начала эпохи POSIX.
stats.birthtimeMs
Метка времени создания этого файла, выраженная в миллисекундах с начала эпохи POSIX.
stats.atimeNs
- Тип:
<bigint>
Присутствует только в том случае, если в метод, создающий объект, передано bigint: true. Метка времени последнего доступа к этому файлу, выраженная в наносекундах с начала эпохи POSIX.
stats.mtimeNs
- Тип:
<bigint>
Присутствует только в том случае, если в метод, создающий объект, передано bigint: true. Метка времени последнего изменения этого файла, выраженная в наносекундах с начала эпохи POSIX.
stats.ctimeNs
- Тип:
<bigint>
Присутствует только в том случае, если в метод, создающий объект, передано bigint: true. Метка времени последнего изменения состояния файла, выраженная в наносекундах с начала эпохи POSIX.
stats.birthtimeNs
- Тип:
<bigint>
Присутствует только в том случае, если в метод, создающий объект, передано bigint: true. Метка времени создания этого файла, выраженная в наносекундах с начала эпохи POSIX.
stats.atime
- Тип:
<Date>
Метка времени последнего доступа к этому файлу.
stats.mtime
- Тип:
<Date>
Метка времени последнего изменения этого файла.
stats.ctime
- Тип:
<Date>
Метка времени, указывающая, когда в последний раз изменялось состояние файла.
stats.birthtime
- Тип:
<Date>
Метка времени, указывающая время создания этого файла.
Значения времени Stat
Свойства atimeMs, mtimeMs, ctimeMs, birthtimeMs — это числовые значения, содержащие соответствующее время в миллисекундах. Их точность зависит от платформы. Если при вызове метода, создающего объект, передан параметр bigint: true, значения свойств будут иметь тип bigint, в противном случае это будут числа.
Свойства atimeNs, mtimeNs, ctimeNs, birthtimeNs — это значения типа bigint, содержащие соответствующее время в наносекундах. Они присутствуют только в том случае, если при вызове метода, создающего объект, передан параметр bigint: true. Их точность зависит от платформы.
Объекты Date atime, mtime, ctime и birthtime представляют собой альтернативные представления различных значений времени. Значения Date и числовые значения не связаны между собой. Присваивание нового числового значения или изменение значения Date не повлияет на соответствующее альтернативное представление.
Значения времени в объекте stat имеют следующую семантику:
-
atime«Время доступа»: время последнего обращения к данным файла. Изменяется системными вызовамиmknod(2),utimes(2)иread(2). -
mtime«Время изменения»: время последнего изменения данных файла. Изменяется системными вызовамиmknod(2),utimes(2)иwrite(2). -
ctime«Время смены состояния»: время последнего изменения состояния файла (изменения данных inode). Изменяется системными вызовамиchmod(2),chown(2),link(2),mknod(2),rename(2),unlink(2),utimes(2),read(2)иwrite(2). -
birthtime«Время создания»: время создания файла. Устанавливается один раз при создании файла. В файловых системах, где время создания недоступно, это поле может содержать вместо него значениеctimeили1970-01-01T00:00Z(то есть метку времени эпохи Unix0). В таком случае это значение может быть больше, чемatimeилиmtime. В Darwin и других вариантах FreeBSD это значение также устанавливается, если с помощью системного вызоваutimes(2)параметрatimeявно устанавливается в значение, предшествующее текущему значениюbirthtime.
До Node.js 0.12 свойство ctime в системах Windows содержало значение birthtime. Начиная с версии 0.12, ctime не означает «время создания», а в системах Unix оно никогда этого не означало.
Класс: fs.StatFs
Предоставляет сведения о смонтированной файловой системе.
Объекты, возвращаемые методом fs.statfs() и его синхронным аналогом, относятся к этому типу. Если параметр bigint в объекте options, переданном этим методам, равен true, числовые значения будут иметь тип bigint вместо number.
StatFs {
type: 1397114950,
bsize: 4096,
frsize: 4096,
blocks: 121938943,
bfree: 61058895,
bavail: 61058895,
files: 999,
ffree: 1000000
}
consolecopy
Версия bigint:
StatFs {
type: 1397114950n,
bsize: 4096n,
frsize: 4096n,
blocks: 121938943n,
bfree: 61058895n,
bavail: 61058895n,
files: 999n,
ffree: 1000000n
}
consolecopy
statfs.bavail
Свободные блоки, доступные непривилегированным пользователям. Умножьте это значение на statfs.bsize, чтобы получить количество доступных байтов.
Модули JavaScript
import { statfs } from 'node:fs/promises';
const stats = await statfs('/');
const availableBytes = stats.bsize * stats.bavail;
console.log(`Available space: ${availableBytes} bytes`);
CommonJS
const { statfs } = require('node:fs/promises');
(async () => {
const stats = await statfs('/');
const availableBytes = stats.bsize * stats.bavail;
console.log(`Available space: ${availableBytes} bytes`);
})();
statfs.bfree
Свободные блоки в файловой системе. Умножьте это значение на statfs.bsize, чтобы получить количество свободных байтов.
Модули JavaScript
import { statfs } from 'node:fs/promises';
const stats = await statfs('/');
const freeBytes = stats.bsize * stats.bfree;
console.log(`Free space: ${freeBytes} bytes`);
CommonJS
const { statfs } = require('node:fs/promises');
(async () => {
const stats = await statfs('/');
const freeBytes = stats.bsize * stats.bfree;
console.log(`Free space: ${freeBytes} bytes`);
})();
statfs.blocks
Общее количество блоков данных в файловой системе. Умножьте это значение на statfs.bsize, чтобы получить общий размер в байтах.
Модули JavaScript
import { statfs } from 'node:fs/promises';
const stats = await statfs('/');
const totalBytes = stats.bsize * stats.blocks;
console.log(`Total space: ${totalBytes} bytes`);
CommonJS
const { statfs } = require('node:fs/promises');
(async () => {
const stats = await statfs('/');
const totalBytes = stats.bsize * stats.blocks;
console.log(`Total space: ${totalBytes} bytes`);
})();
statfs.bsize
Оптимальный размер блока передачи в байтах.
statfs.frsize
Фундаментальный размер блока файловой системы.
statfs.ffree
Свободные файловые узлы в файловой системе.
statfs.files
Общее количество файловых узлов в файловой системе.
statfs.type
Тип файловой системы. Числовой идентификатор типа файловой системы, специфичный для платформы. Это значение соответствует полю f_type, возвращаемому statfs(2) в системах POSIX (например, 0xEF53 для ext4 в Linux). Его значение зависит от ОС и не гарантирует согласованности между платформами.
Класс: fs.Utf8Stream
Стабильность: 1 — Экспериментальный
Оптимизированный потоковый писатель UTF-8, позволяющий по запросу сбрасывать всю внутреннюю буферизацию. Он корректно обрабатывает ошибки EAGAIN и допускает настройку поведения, например отбрасывание данных, если диск занят.
Событие: 'close'
Событие 'close' генерируется, когда поток полностью закрыт.
Событие: 'drain'
Событие 'drain' генерируется, когда внутренний буфер достаточно опустел, чтобы можно было продолжить запись.
Событие: 'drop'
Событие 'drop' генерируется, когда достигнута максимальная длина и данные не будут записаны. Отброшенные данные передаются в качестве первого аргумента обработчику события.
Событие: 'error'
Событие 'error' генерируется при возникновении ошибки.
Событие: 'finish'
Событие 'finish' генерируется, когда поток завершен и все данные сброшены в базовый файл.
Событие: 'ready'
Событие 'ready' генерируется, когда поток готов принимать данные для записи.
Событие: 'write'
Событие 'write' генерируется после завершения операции записи. Количество записанных байтов передается в качестве первого аргумента обработчику события.
new fs.Utf8Stream([options])
-
options<Object>-
append:<boolean>Добавляет данные в конец файла назначения вместо его усечения. По умолчанию:true. -
contentMode:<string>Тип данных, которые можно передать функции записи; поддерживаются значения'utf8'или'buffer'. По умолчанию:'utf8'. -
dest:<string>Путь к файлу, в который выполняется запись (режим определяется параметром append). -
fd:<number>Дескриптор файла, возвращаемыйfs.open()илиfs.openSync(). -
fs:<Object>Объект с тем же API, что и у модуляfs; полезен для имитации, тестирования или настройки поведения потока. -
fsync:<boolean>Выполнятьfs.fsyncSync()при каждом завершении записи. -
maxLength:<number>Максимальный размер внутреннего буфера. Если операция записи приведёт к превышению значенияmaxLength, записываемые данные отбрасываются и генерируется событие drop с отброшенными данными. -
maxWrite:<number>Максимальное количество байтов, которое можно записать; По умолчанию:16384 -
minLength:<number>Минимальный размер внутреннего буфера, который должен быть заполнен перед сбросом. -
mkdir:<boolean>Если значение равно true, обеспечить наличие каталога для файлаdest. По умолчанию:false. -
mode:<number>|<string>Указать режим создания файла (см.fs.open()). -
periodicFlush:<number>Вызывать сброс буфера каждыеperiodicFlushмиллисекунд. -
retryEAGAIN<Function>Функция, вызываемая, когда при выполненииwrite(),writeSync()илиflushSync()возникает ошибкаEAGAINилиEBUSY. Если возвращаемое значение —true, операция будет повторена; в противном случае ошибка будет передана выше.err— ошибка, вызвавшая вызов этой функции,writeBufferLen— размер записанного буфера, аremainingBufferLen— размер оставшейся части буфера, которую поток не пытался записать. -
sync:<boolean>Выполнять запись синхронно.
-
utf8Stream.append
-
<boolean>Добавляет ли поток данные в конец файла или усекает его.
utf8Stream.contentMode
-
<string>Тип данных, которые можно записать в поток. Поддерживаются значения'utf8'или'buffer'. По умолчанию:'utf8'.
utf8Stream.destroy()
Немедленно закрывает поток, не сбрасывая внутренний буфер.
utf8Stream.end()
Корректно закрывает поток, сбрасывая внутренний буфер перед закрытием.
utf8Stream.fd
-
<number>Дескриптор файла, в который выполняется запись.
utf8Stream.file
-
<string>Файл, в который выполняется запись.
utf8Stream.flush(callback)
-
callback<Function>
Записывает текущий буфер в файл, если запись не выполняется. Ничего не делает, если значение minLength равно нулю или запись уже выполняется.
utf8Stream.flushSync()
Синхронно сбрасывает буферизованные данные. Это затратная операция.
utf8Stream.fsync
-
<boolean>Выполняет ли потокfs.fsyncSync()после каждой операции записи.
utf8Stream.maxLength
-
<number>Максимальная длина внутреннего буфера. Если в результате операции записи длина буфера превыситmaxLength, записываемые данные будут отброшены, а вместе с отброшенными данными будет создано событие drop.
utf8Stream.minLength
-
<number>Минимальная длина внутреннего буфера, при достижении которой буфер сбрасывается.
utf8Stream.mkdir
-
<boolean>Должен ли поток проверять наличие каталога для файлаdest. Если задано значениеtrue, каталог будет создан, если он не существует. По умолчанию:false.
utf8Stream.mode
utf8Stream.periodicFlush
-
<number>Интервал между сбросами в миллисекундах. Если задано значение0, периодический сброс выполняться не будет.
utf8Stream.reopen(file)
-
file:<string>|<Buffer>|<URL>Путь к файлу, в который выполняется запись (режим определяется параметром append).
Повторно открыть файл на месте; полезно при ротации журналов.
utf8Stream.sync
-
<boolean>Выполняет ли поток запись синхронно или асинхронно.
utf8Stream.write(data)
Если при создании потока для options.contentMode задано значение 'utf8', аргумент data должен быть строкой. Если для contentMode задано значение 'buffer', аргумент data должен иметь тип <Buffer>.
utf8Stream.writing
-
<boolean>Выполняет ли поток в данный момент запись данных в файл.
utf8Stream[Symbol.dispose]()
Вызывает utf8Stream.destroy().
Класс: fs.WriteStream
- Расширяет
<stream.Writable>
Экземпляры <fs.WriteStream> нельзя создавать напрямую. Они создаются и возвращаются функцией fs.createWriteStream().
Событие: 'close'
Создается, когда базовый файловый дескриптор <fs.WriteStream> закрывается.
Событие: 'open'
-
fd<integer>Целочисленный файловый дескриптор, используемый объектом<fs.WriteStream>.
Создается, когда файл объекта <fs.WriteStream> открывается.
Событие: 'ready'
Создается, когда <fs.WriteStream> готов к использованию.
Срабатывает сразу после 'open'.
writeStream.bytesWritten
Количество записанных на данный момент байтов. Не включает данные, которые все еще ожидают записи в очереди.
writeStream.close([callback])
-
callback<Function>-
err<Error>
-
Закрывает writeStream. Можно передать функцию обратного вызова, которая будет выполнена после закрытия writeStream.
writeStream.path
Путь к файлу, в который выполняется запись потоком, как указано в первом аргументе функции fs.createWriteStream(). Если path передан как строка, то writeStream.path будет строкой. Если path передан как <Buffer>, то writeStream.path будет иметь тип <Buffer>.
writeStream.pending
- Тип:
<boolean>
Это свойство имеет значение true, если базовый файл еще не открыт, то есть до создания события 'ready'.
fs.constants
- Тип:
<Object>
Возвращает объект, содержащий часто используемые константы для операций с файловой системой.
Константы FS
Следующие константы экспортируются модулями fs.constants и fsPromises.constants.
Не все константы доступны во всех операционных системах; особенно важно учитывать это в Windows, где недоступны многие определения, специфичные для POSIX. Для переносимых приложений рекомендуется перед использованием проверять наличие констант.
Чтобы использовать несколько констант, применяйте оператор побитового ИЛИ |.
Пример:
import { open, constants } from 'node:fs';
const {
O_RDWR,
O_CREAT,
O_EXCL,
} = constants;
open('/path/to/my/file', O_RDWR | O_CREAT | O_EXCL, (err, fd) => {
// ...
});
mjscopyКонстанты доступа к файлам
Следующие константы предназначены для использования в качестве параметра mode, передаваемого в fsPromises.access(), fs.access() и fs.accessSync().
| Константа | Описание |
|---|---|
F_OK | Флаг, указывающий, что файл виден вызывающему процессу. Это полезно для определения существования файла, но ничего не говорит о разрешениях rwx. Используется по умолчанию, если режим не указан. |
R_OK | Флаг, указывающий, что вызывающий процесс может читать файл. |
W_OK | Флаг, указывающий, что вызывающий процесс может записывать данные в файл. |
X_OK | Флаг, указывающий, что вызывающий процесс может выполнять файл. В Windows этот флаг не действует (работает как fs.constants.F_OK). |
Эти определения также доступны в Windows.
Константы копирования файлов
Следующие константы предназначены для использования с fs.copyFile().
| Константа | Описание |
|---|---|
COPYFILE_EXCL | Если этот флаг указан, операция копирования завершится ошибкой, если файл по целевому пути уже существует. |
COPYFILE_FICLONE | Если этот флаг указан, операция копирования попытается создать reflink с копированием при записи. Если нижележащая платформа не поддерживает копирование при записи, используется резервный механизм копирования. |
COPYFILE_FICLONE_FORCE | Если этот флаг указан, операция копирования попытается создать reflink с копированием при записи. Если нижележащая платформа не поддерживает копирование при записи, операция завершится ошибкой. |
Эти определения также доступны в Windows.
Константы открытия файлов
Следующие константы предназначены для использования с fs.open().
| Константа | Описание |
|---|---|
O_RDONLY | Флаг, указывающий на открытие файла только для чтения. |
O_WRONLY | Флаг, указывающий на открытие файла только для записи. |
O_RDWR | Флаг, указывающий на открытие файла для чтения и записи. |
O_CREAT | Флаг, указывающий на создание файла, если он ещё не существует. |
O_EXCL | Флаг, указывающий, что открытие файла должно завершиться ошибкой, если установлен флаг O_CREAT и файл уже существует. |
O_NOCTTY | Флаг, указывающий, что если путь указывает на терминальное устройство, его открытие не должно приводить к тому, что этот терминал станет управляющим терминалом процесса (если у процесса его ещё нет). |
O_TRUNC | Флаг, указывающий, что если файл существует и является обычным файлом, а его удалось открыть для записи, его длина будет усечена до нуля. |
O_APPEND | Флаг, указывающий, что данные будут добавляться в конец файла. |
O_DIRECTORY | Флаг, указывающий, что открытие должно завершиться ошибкой, если путь не является каталогом. |
O_NOATIME | Флаг, указывающий, что операции чтения файловой системы больше не будут приводить к обновлению сведений atime, связанных с файлом. Этот флаг доступен только в операционных системах Linux. |
O_NOFOLLOW | Флаг, указывающий, что открытие должно завершиться ошибкой, если путь является символической ссылкой. |
O_SYNC | Флаг, указывающий, что файл открыт для синхронизированного ввода-вывода, при котором операции записи ожидают обеспечения целостности файла. |
O_DSYNC | Флаг, указывающий, что файл открыт для синхронизированного ввода-вывода, при котором операции записи ожидают обеспечения целостности данных. |
O_SYMLINK | Флаг, указывающий на открытие самой символической ссылки, а не ресурса, на который она указывает. |
O_DIRECT | Если этот флаг установлен, предпринимается попытка свести к минимуму влияние кэширования на операции ввода-вывода с файлами. |
O_NONBLOCK | Флаг, указывающий на открытие файла в неблокирующем режиме, если это возможно. |
UV_FS_O_FILEMAP | Если этот флаг установлен, для доступа к файлу используется отображение файла в память. Этот флаг доступен только в операционных системах Windows. В других операционных системах он игнорируется. |
В Windows доступны только O_APPEND, O_CREAT, O_EXCL, O_RDONLY, O_RDWR, O_TRUNC, O_WRONLY и UV_FS_O_FILEMAP.
Константы типов файлов
Следующие константы предназначены для использования со свойством mode объекта <fs.Stats> для определения типа файла.
| Константа | Описание |
|---|---|
S_IFMT | Битовая маска, используемая для извлечения кода типа файла. |
S_IFREG | Константа типа файла для обычного файла. |
S_IFDIR | Константа типа файла для каталога. |
S_IFCHR | Константа типа файла для символьного устройства. |
S_IFBLK | Константа типа файла для блочного устройства. |
S_IFIFO | Константа типа файла для FIFO-канала. |
S_IFLNK | Константа типа файла для символической ссылки. |
S_IFSOCK | Константа типа файла для сокета. |
В Windows доступны только S_IFCHR, S_IFDIR, S_IFLNK, S_IFMT и S_IFREG.
Константы режимов файлов
Следующие константы предназначены для использования со свойством mode объекта <fs.Stats> для определения прав доступа к файлу.
| Константа | Описание |
|---|---|
S_IRWXU | Режим файла, указывающий на наличие у владельца прав на чтение, запись и выполнение. |
S_IRUSR | Режим файла, указывающий на наличие у владельца права на чтение. |
S_IWUSR | Режим файла, указывающий на наличие у владельца права на запись. |
S_IXUSR | Режим файла, указывающий на наличие у владельца права на выполнение. |
S_IRWXG | Режим файла, указывающий на наличие у группы прав на чтение, запись и выполнение. |
S_IRGRP | Режим файла, указывающий на наличие у группы права на чтение. |
S_IWGRP | Режим файла, указывающий на наличие у группы права на запись. |
S_IXGRP | Режим файла, указывающий на наличие у группы права на выполнение. |
S_IRWXO | Режим файла, указывающий на наличие у остальных пользователей прав на чтение, запись и выполнение. |
S_IROTH | Режим файла, указывающий на наличие у остальных пользователей права на чтение. |
S_IWOTH | Режим файла, указывающий на наличие у остальных пользователей права на запись. |
S_IXOTH | Режим файла, указывающий на наличие у остальных пользователей права на выполнение. |
В Windows доступны только S_IRUSR и S_IWUSR.
Примечания
Порядок выполнения операций с обратными вызовами и промисами
Поскольку эти операции выполняются асинхронно в базовом пуле потоков, при использовании методов с обратными вызовами или промисами порядок их выполнения не гарантируется.
Например, следующий код может привести к ошибке, поскольку операция fs.stat() может завершиться раньше операции fs.rename():
const fs = require('node:fs');
fs.rename('/tmp/hello', '/tmp/world', (err) => {
if (err) throw err;
console.log('renamed complete');
});
fs.stat('/tmp/world', (err, stats) => {
if (err) throw err;
console.log(`stats: ${JSON.stringify(stats)}`);
});
jscopy
Важно правильно упорядочивать операции, ожидая результата одной из них, прежде чем вызывать другую:
Модули JavaScript
import { rename, stat } from 'node:fs/promises';
const oldPath = '/tmp/hello';
const newPath = '/tmp/world';
try {
await rename(oldPath, newPath);
const stats = await stat(newPath);
console.log(`stats: ${JSON.stringify(stats)}`);
} catch (error) {
console.error('there was an error:', error.message);
}
CommonJS
const { rename, stat } = require('node:fs/promises');
(async function(oldPath, newPath) {
try {
await rename(oldPath, newPath);
const stats = await stat(newPath);
console.log(`stats: ${JSON.stringify(stats)}`);
} catch (error) {
console.error('there was an error:', error.message);
}
})('/tmp/hello', '/tmp/world');
При использовании API с обратными вызовами вызов fs.stat() следует поместить в обратный вызов операции fs.rename():
Модули JavaScript
import { rename, stat } from 'node:fs';
rename('/tmp/hello', '/tmp/world', (err) => {
if (err) throw err;
stat('/tmp/world', (err, stats) => {
if (err) throw err;
console.log(`stats: ${JSON.stringify(stats)}`);
});
});
CommonJS
const { rename, stat } = require('node:fs/promises');
rename('/tmp/hello', '/tmp/world', (err) => {
if (err) throw err;
stat('/tmp/world', (err, stats) => {
if (err) throw err;
console.log(`stats: ${JSON.stringify(stats)}`);
});
});
Пути к файлам
Большинство операций fs принимают пути к файлам, которые можно указать в виде строки, объекта <Buffer> или объекта <URL> с использованием протокола file:.
Строковые пути
Строковые пути интерпретируются как последовательности символов UTF-8, задающие абсолютное или относительное имя файла. Относительные пути разрешаются относительно текущего рабочего каталога, определяемого вызовом process.cwd().
Пример с абсолютным путем в POSIX:
import { open } from 'node:fs/promises';
let fd;
try {
fd = await open('/open/some/file.txt', 'r');
// Do something with the file
} finally {
await fd?.close();
}
mjscopy
Пример с относительным путем в POSIX (относительно process.cwd()):
import { open } from 'node:fs/promises';
let fd;
try {
fd = await open('file.txt', 'r');
// Do something with the file
} finally {
await fd?.close();
}
mjscopyПути в URL файлов
Для большинства функций модуля node:fs аргумент path или filename можно передать как объект <URL> с использованием протокола file:.
import { readFileSync } from 'node:fs';
readFileSync(new URL('file:///tmp/hello'));
mjscopy
URL-адреса file: всегда являются абсолютными путями.
Особенности платформ
В Windows объекты <URL> file: с именем хоста преобразуются в пути UNC, а объекты <URL> file: с буквой диска — в локальные абсолютные пути. Объекты <URL> file: без имени хоста и буквы диска приведут к ошибке:
import { readFileSync } from 'node:fs';
// On Windows :
// - WHATWG file URLs with hostname convert to UNC path
// file://hostname/p/a/t/h/file => \\hostname\p\a\t\h\file
readFileSync(new URL('file://hostname/p/a/t/h/file'));
// - WHATWG file URLs with drive letters convert to absolute path
// file:///C:/tmp/hello => C:\tmp\hello
readFileSync(new URL('file:///C:/tmp/hello'));
// - WHATWG file URLs without hostname must have a drive letters
readFileSync(new URL('file:///notdriveletter/p/a/t/h/file'));
readFileSync(new URL('file:///c/p/a/t/h/file'));
// TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must be absolute
mjscopy
Объекты <URL> file: с буквами дисков должны использовать : в качестве разделителя сразу после буквы диска. Использование другого разделителя приведет к ошибке.
На всех остальных платформах объекты <URL> file: с именем хоста не поддерживаются и приведут к ошибке:
import { readFileSync } from 'node:fs';
// On other platforms:
// - WHATWG file URLs with hostname are unsupported
// file://hostname/p/a/t/h/file => throw!
readFileSync(new URL('file://hostname/p/a/t/h/file'));
// TypeError [ERR_INVALID_FILE_URL_PATH]: must be absolute
// - WHATWG file URLs convert to absolute path
// file:///tmp/hello => /tmp/hello
readFileSync(new URL('file:///tmp/hello'));
mjscopy
Объект <URL> file: с закодированными символами косой черты приведет к ошибке на всех платформах:
import { readFileSync } from 'node:fs';
// On Windows
readFileSync(new URL('file:///C:/p/a/t/h/%2F'));
readFileSync(new URL('file:///C:/p/a/t/h/%2f'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
\ or / characters */
// On POSIX
readFileSync(new URL('file:///p/a/t/h/%2F'));
readFileSync(new URL('file:///p/a/t/h/%2f'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
/ characters */
mjscopy
В Windows объекты <URL> file: с закодированной обратной косой чертой приведут к ошибке:
import { readFileSync } from 'node:fs';
// On Windows
readFileSync(new URL('file:///C:/path/%5C'));
readFileSync(new URL('file:///C:/path/%5c'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
\ or / characters */
mjscopyПути Buffer
Пути, заданные с помощью объекта <Buffer>, полезны главным образом в некоторых POSIX-совместимых операционных системах, которые рассматривают пути к файлам как непрозрачные последовательности байтов. В таких системах один путь к файлу может содержать последовательности байтов в нескольких кодировках. Как и строковые пути, пути <Buffer> могут быть относительными или абсолютными:
Пример с абсолютным путем в POSIX:
import { open } from 'node:fs/promises';
import { Buffer } from 'node:buffer';
let fd;
try {
fd = await open(Buffer.from('/open/some/file.txt'), 'r');
// Do something with the file
} finally {
await fd?.close();
}
mjscopyОтдельные рабочие каталоги для дисков в Windows
В Windows Node.js следует концепции отдельных рабочих каталогов для каждого диска. Это поведение можно наблюдать при использовании пути к диску без обратной косой черты. Например, fs.readdirSync('C:\\') может вернуть результат, отличный от результата fs.readdirSync('C:'). Дополнительные сведения см. на этой странице MSDN.
Дескрипторы файлов
В POSIX-системах ядро поддерживает для каждого процесса таблицу открытых в данный момент файлов и ресурсов. Каждому открытому файлу присваивается простой числовой идентификатор, называемый дескриптором файла. На уровне системы все операции с файловой системой используют эти дескрипторы для идентификации и отслеживания каждого отдельного файла. В системах Windows для отслеживания ресурсов используется другой, но концептуально схожий механизм. Чтобы упростить работу пользователей, Node.js скрывает различия между операционными системами и присваивает всем открытым файлам числовой дескриптор.
Методы fs.open() с обратным вызовом и fs.openSync() для синхронного выполнения открывают файл и выделяют новый дескриптор файла. После выделения дескриптор можно использовать для чтения данных из файла, записи данных в файл или получения сведений о файле.
Операционные системы ограничивают количество дескрипторов файлов, которые могут быть открыты одновременно, поэтому крайне важно закрывать дескриптор после завершения операций. Если этого не делать, произойдёт утечка памяти, которая в конечном итоге приведёт к сбою приложения.
import { open, close, fstat } from 'node:fs';
function closeFd(fd) {
close(fd, (err) => {
if (err) throw err;
});
}
open('/open/some/file.txt', 'r', (err, fd) => {
if (err) throw err;
try {
fstat(fd, (err, stat) => {
if (err) {
closeFd(fd);
throw err;
}
// use stat
closeFd(fd);
});
} catch (err) {
closeFd(fd);
throw err;
}
});
mjscopy
В API на основе промисов вместо числового дескриптора файла используется объект <FileHandle>. Система лучше управляет такими объектами, чтобы предотвращать утечки ресурсов. Тем не менее после завершения операций их всё равно необходимо закрывать:
import { open } from 'node:fs/promises';
let file;
try {
file = await open('/open/some/file.txt', 'r');
const stat = await file.stat();
// use stat
} finally {
await file.close();
}
mjscopyИспользование пула потоков
Все API файловой системы с обратными вызовами и на основе промисов (за исключением fs.FSWatcher()) используют пул потоков libuv. Для некоторых приложений это может иметь неожиданные и негативные последствия для производительности. Подробнее см. в документации UV_THREADPOOL_SIZE.
Флаги файловой системы
Следующие флаги доступны везде, где параметр flag принимает строку.
-
'a': открыть файл для добавления данных. Если файл не существует, он будет создан. -
'ax': как'a', но операция завершается ошибкой, если путь существует. -
'a+': открыть файл для чтения и добавления данных. Если файл не существует, он будет создан. -
'ax+': как'a+', но операция завершается ошибкой, если путь существует. -
'as': открыть файл для добавления данных в синхронном режиме. Если файл не существует, он будет создан. -
'as+': открыть файл для чтения и добавления данных в синхронном режиме. Если файл не существует, он будет создан. -
'r': открыть файл для чтения. Если файл не существует, возникает исключение. -
'rs': открыть файл для чтения в синхронном режиме. Если файл не существует, возникает исключение. -
'r+': открыть файл для чтения и записи. Если файл не существует, возникает исключение. -
'rs+': открыть файл для чтения и записи в синхронном режиме. Указывает операционной системе обходить кеш локальной файловой системы.Это особенно полезно при открытии файлов на подключениях NFS, поскольку позволяет обойти потенциально устаревший локальный кеш. Этот флаг существенно влияет на производительность ввода-вывода, поэтому его не рекомендуется использовать без необходимости.
Этот флаг не превращает
fs.open()илиfsPromises.open()в синхронный блокирующий вызов. Если требуется синхронная операция, следует использовать что-то вродеfs.openSync(). -
'w': открыть файл для записи. Файл будет создан, если он не существует, или усечён, если существует. -
'wx': как'w', но операция завершается ошибкой, если путь существует. -
'w+': открыть файл для чтения и записи. Файл будет создан, если он не существует, или усечён, если существует. -
'wx+': как'w+', но операция завершается ошибкой, если путь существует.
flag также может быть числом, как описано в open(2); часто используемые константы доступны из fs.constants. В Windows флаги преобразуются в соответствующие эквиваленты, если они существуют, например O_WRONLY в FILE_GENERIC_WRITE или O_EXCL|O_CREAT в CREATE_NEW, принимаемые CreateFileW.
Эксклюзивный флаг 'x' (флаг O_EXCL в open(2)) приводит к ошибке операции, если путь уже существует. В POSIX, если путь является символической ссылкой, использование O_EXCL приводит к ошибке, даже если ссылка указывает на несуществующий путь. Эксклюзивный флаг может не работать с сетевыми файловыми системами.
В Linux позиционная запись не работает, если файл открыт в режиме добавления. Ядро игнорирует аргумент позиции и всегда добавляет данные в конец файла.
Для изменения файла, а не его замены, может потребоваться установить параметр flag в значение 'r+' вместо значения по умолчанию 'w'.
Поведение некоторых флагов зависит от платформы. Поэтому попытка открыть каталог в macOS и Linux с флагом 'a+', как в примере ниже, приведёт к ошибке. В Windows и FreeBSD, напротив, будет возвращён дескриптор файла или FileHandle.
// macOS and Linux
fs.open('<directory>', 'a+', (err, fd) => {
// => [Error: EISDIR: illegal operation on a directory, open <directory>]
});
// Windows and FreeBSD
fs.open('<directory>', 'a+', (err, fd) => {
// => null, <fd>
});
jscopy
В Windows попытка открыть существующий скрытый файл с флагом 'w' (через fs.open(), fs.writeFile() или fsPromises.open()) завершится ошибкой EPERM. Существующие скрытые файлы можно открыть для записи с флагом 'r+'.
Для сброса содержимого файла можно использовать вызов fs.ftruncate() или filehandle.truncate().
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/api/fs.html