Файловая система
Исходный код: lib/fs.js
Модуль 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> | <Iterable> | <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();
} copy
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); copy Если 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 }); copy
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.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().
filehandle.readFile(options)
-
options<Object> | <string>-
encoding<string> | <null> По умолчанию:null -
signal<AbortSignal> позволяет отменить выполняющийся вызов readFile
-
- Возвращает: <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.
-
- Возвращает: <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();
} copy Если исходный размер файла был меньше 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, данные будут записаны в текущую позицию. Подробнее см. в документации POSIXpwrite(2). По умолчанию:null -
encoding<string> Ожидаемая кодировка строки. По умолчанию:'utf8' - Возвращает: <Promise>
Записывает string в файл. Если string не является строкой, промис отклоняется с ошибкой.
Промис выполняется с объектом, содержащим два свойства:
Небезопасно вызывать filehandle.write() несколько раз для одного и того же файла, не дождавшись выполнения (или отклонения) промиса. В этом случае используйте filehandle.createWriteStream().
В Linux позиционная запись не работает, если файл открыт в режиме добавления. Ядро игнорирует аргумент позиции и всегда добавляет данные в конец файла.
filehandle.writeFile(data, options)
-
data<string> | <Buffer> | <TypedArray> | <DataView> | <AsyncIterable> | <Iterable> | <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[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');
} copy Не рекомендуется использовать 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');
} copy
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') не поддерживаются. -
withFileTypes<boolean>true, если glob должен возвращать пути в виде Dirent, иfalseв противном случае. По умолчанию:false.
-
- Возвращает: <AsyncIterator> Асинхронный итератор, выдающий пути к файлам, соответствующим шаблону.
Модули 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.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);
} copy Метод 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> Разрешается промисом для асинхронно освобождаемого объекта:
-
path<string> Путь к созданному каталогу. -
remove<AsyncFunction> Функция, удаляющая созданный каталог. -
[Symbol.asyncDispose]<AsyncFunction> То же, что иremove.
-
Возвращаемый промис содержит асинхронно освобождаемый объект, свойство 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);
} copy При использовании асинхронного итератора объект <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);
} copy
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);
} copy Отмена выполняющегося запроса не отменяет отдельные запросы операционной системы, а прерывает внутреннюю буферизацию, которую выполняет 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().
Поддерживаются только пути, которые можно преобразовать в строки UTF-8.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим кодировку символов для пути. Если для encoding задано значение 'buffer', возвращаемый путь будет представлен объектом <Buffer>.
В Linux, когда Node.js связан с musl libc, для работы этой функции файловая система procfs должна быть смонтирована в /proc. Для Glibc такого ограничения нет.
fsPromises.rmdir(path[, options])
-
path<string> | <Buffer> | <URL> -
options<Object>-
maxRetries<integer> При возникновении ошибкиEBUSY,EMFILE,ENFILE,ENOTEMPTYилиEPERMNode.js повторяет операцию, увеличивая время ожидания при линейной задержке наretryDelayмиллисекунд после каждой попытки. Этот параметр задаёт количество повторных попыток. Этот параметр игнорируется, если параметрrecursiveне равенtrue. По умолчанию:0. -
recursive<boolean> Если значение равноtrue, выполняется рекурсивное удаление каталога. В рекурсивном режиме операции повторяются при сбое. По умолчанию:false. Устарел. -
retryDelay<integer> Время ожидания между повторными попытками в миллисекундах. Этот параметр игнорируется, если параметрrecursiveне равенtrue. По умолчанию:100.
-
- Возвращает: <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.
-
- Возвращает: <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,
Dates или числовая строка, например'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> Если событий для постановки в очередь больше, чем допускаетmaxQueue, значение может быть'ignore'или'throw'.'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;
}
})(); copy На большинстве платформ событие 'rename' генерируется каждый раз, когда имя файла появляется в каталоге или исчезает из него.
Все оговорки для fs.watch() также применяются к fsPromises.watch().
fsPromises.writeFile(file, data[, options])
-
file<string> | <Buffer> | <URL> | <FileHandle> имя файла илиFileHandle -
data<string> | <Buffer> | <TypedArray> | <DataView> | <AsyncIterable> | <Iterable> | <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);
} copy Отмена выполняющегося запроса не отменяет отдельные запросы операционной системы, а прекращает внутреннюю буферизацию, выполняемую 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`);
}); copy Не используйте 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;
});
}
});
}); copy запись (РЕКОМЕНДУЕТСЯ)
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;
});
}
}); copy чтение (НЕ РЕКОМЕНДУЕТСЯ)
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;
});
}
});
}); copy чтение (РЕКОМЕНДУЕТСЯ)
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;
});
}
}); copy В приведенных выше примерах «не рекомендуется» сначала проверяется доступность, а затем используется файл; примеры «рекомендуется» лучше, поскольку они непосредственно используют файл и при необходимости обрабатывают ошибку.
Как правило, проверяйте доступность файла только в том случае, если файл не будет использоваться непосредственно, например когда доступность служит сигналом для другого процесса.
В 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!');
}); copy Если options является строкой, она задает кодировку:
import { appendFile } from 'node:fs';
appendFile('message.txt', 'data to append', 'utf8', callback); copy В качестве 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;
}
}); copy
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!');
}); copy Режимы доступа к файлам
Аргумент 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); copy
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); copy Если autoClose имеет значение false, файловый дескриптор не будет закрыт, даже в случае ошибки. Приложение должно самостоятельно закрыть его и убедиться, что утечки файловых дескрипторов не происходит. Если для autoClose задано значение true (поведение по умолчанию), при возникновении 'error' или 'end' файловый дескриптор будет закрыт автоматически.
mode задает режим файла (права доступа и sticky-биты), но только если файл был создан.
Пример чтения последних 10 байтов файла длиной 100 байт:
import { createReadStream } from 'node:fs';
createReadStream('sample.txt', { start: 90, end: 99 }); copy Если 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)
-
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!');
}); copy Параметры этого обратного вызова не соответствуют параметрам других обратных вызовов Node.js. Обычно первый параметр обратного вызова Node.js — это параметр err, за которым могут следовать другие параметры. Обратный вызов fs.exists() принимает только один логический параметр. Это одна из причин, по которой рекомендуется использовать fs.access() вместо fs.exists().
Если 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;
});
}
});
}
}); copy запись (РЕКОМЕНДУЕТСЯ)
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;
});
}
}); copy чтение (НЕ РЕКОМЕНДУЕТСЯ)
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');
}
}); copy чтение (РЕКОМЕНДУЕТСЯ)
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;
});
}
}); copy В приведенных выше примерах «не рекомендуется» проверяется наличие файла, а затем он используется; примеры «рекомендуется» лучше, поскольку в них файл используется напрямую и обрабатывается возможная ошибка.
В общем случае проверяйте наличие файла только в том случае, если он не будет использоваться напрямую, например когда его наличие служит сигналом от другого процесса.
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;
}
}); copy Если размер файла ранее был меньше 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. -
withFileTypes<boolean>true, если glob должен возвращать пути в виде Dirent, иfalseв противном случае. По умолчанию:false.
-
-
callback<Function>-
err<Error>
-
-
Получает файлы, соответствующие указанному шаблону.
Модули 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)
-
path<string> | <Buffer> | <URL> -
mode<integer> -
callback<Function>-
err<Error> | <AggregateError>
-
Изменяет разрешения символической ссылки. В callback завершения передаются только аргументы, необходимые для возможного исключения.
Этот метод реализован только в macOS.
Подробнее см. в документации POSIX для lchmod(2).
fs.lchown(path, uid, gid, callback)
Назначает владельца символической ссылки. В 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(), за исключением того, что если путь указывает на символическую ссылку, она не разыменовывается: вместо этого изменяются временные метки самой символической ссылки.
В callback завершения передаются только аргументы, необходимые для возможного исключения.
fs.link(existingPath, newPath, callback)
-
existingPath<string> | <Buffer> | <URL> -
newPath<string> | <Buffer> | <URL> -
callback<Function>-
err<Error>
-
Создает новую ссылку от existingPath к newPath. Подробнее см. в документации POSIX для link(2). В callback завершения передаются только аргументы, необходимые для возможного исключения.
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.
-
Асинхронно создает каталог.
Обратный вызов получает возможное исключение и, если recursive имеет значение true, путь первого созданного каталога, (err[, path]). Значение path по-прежнему может быть undefined, когда recursive имеет значение true, если каталог не был создан (например, если он уже существовал).
Необязательный аргумент options может быть целым числом, задающим mode (права доступа и биты закрепления), или объектом со свойством 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;
}); copy В Windows использование fs.mkdir() для корневого каталога, даже с рекурсивным режимом, приведет к ошибке:
import { mkdir } from 'node:fs';
mkdir('/', { recursive: true }, (err) => {
// => [Error: EPERM: operation not permitted, mkdir 'C:\']
}); copy Подробнее см. документацию 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 случайными символами.
Путь созданного каталога передается в виде строки во втором параметре обратного вызова.
Необязательный аргумент 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
}); copy Метод 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.
}); copy
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 задает режим файла (права доступа и биты закрепления), но только если файл был создан. В Windows можно изменять только право на запись; см. fs.chmod().
Обратный вызов получает два аргумента (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> -
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);
}); copy Функции обратного вызова передаются два аргумента (err, data), где data — содержимое файла.
Если кодировка не указана, возвращается исходный буфер.
Если options — строка, она задаёт кодировку:
import { readFile } from 'node:fs';
readFile('/etc/passwd', 'utf8', callback); copy Если путь указывает на каталог, поведение 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>
}); copy Выполняющийся запрос можно отменить с помощью AbortSignal. Если запрос отменён, функция обратного вызова вызывается с 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(); copy Функция fs.readFile() буферизует весь файл целиком. Чтобы сократить затраты памяти, по возможности используйте потоковую обработку через fs.createReadStream().
Отмена выполняющегося запроса не отменяет отдельные запросы операционной системы, а отменяет внутреннюю буферизацию, выполняемую fs.readFile.
Дескрипторы файлов
- Указанный дескриптор файла должен поддерживать чтение.
- Если дескриптор файла указан в качестве
path, он не будет закрыт автоматически. - Чтение начнётся с текущей позиции. Например, если файл уже содержит
'Hello World'и с помощью дескриптора файла считываются шесть байт, вызовfs.readFile()с тем же дескриптором файла вернёт'World', а не'Hello World'.
Соображения о производительности
Метод fs.readFile() асинхронно считывает содержимое файла в память порциями, позволяя циклу событий выполняться между ними. Благодаря этому операция чтения меньше влияет на другие действия, использующие пул потоков libuv, но считывание всего файла в память занимает больше времени.
Дополнительные затраты на чтение могут значительно различаться в разных системах и зависят от типа считываемого файла. Если файл не является обычным файлом (например, это канал) и Node.js не может определить фактический размер файла, каждая операция чтения загружает 64 КиБ данных. Для обычных файлов при каждом чтении обрабатывается 512 КиБ данных.
Для приложений, которым необходимо считывать содержимое файлов как можно быстрее, предпочтительнее напрямую использовать 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>-
err<Error> -
bytesRead<integer> -
buffers<ArrayBufferView[]>
-
Читает данные из файла, указанного в 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.
Поддерживаются только пути, которые можно преобразовать в строки UTF-8.
Необязательный аргумент 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).
Поддерживаются только пути, которые можно преобразовать в строки UTF-8.
Необязательный аргумент 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 находится каталог, будет выдана ошибка. В обратный вызов завершения передаются только аргументы, связанные с возможным исключением.
См. также: rename(2).
import { rename } from 'node:fs';
rename('oldFile.txt', 'newFile.txt', (err) => {
if (err) throw err;
console.log('Rename complete!');
}); copy
fs.rmdir(path[, options], callback)
-
path<string> | <Buffer> | <URL> -
options<Object>-
maxRetries<integer> Если возникает ошибкаEBUSY,EMFILE,ENFILE,ENOTEMPTYилиEPERM, Node.js повторяет операцию, увеличивая линейную задержку ожидания наretryDelayмиллисекунд с каждой попыткой. Этот параметр задает количество повторных попыток. Параметр игнорируется, если параметрrecursiveне равенtrue. По умолчанию:0. -
recursive<boolean> Если значение равноtrue, выполняется рекурсивное удаление каталога. В рекурсивном режиме при сбое операции повторяются. По умолчанию:false. Устарело. -
retryDelay<integer> Время ожидания между повторными попытками в миллисекундах. Параметр игнорируется, если параметрrecursiveне равенtrue. По умолчанию:100.
-
-
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илиEPERM, Node.js повторяет операцию, увеличивая линейную задержку ожидания наretryDelayмиллисекунд с каждой попыткой. Этот параметр задает количество повторных попыток. Параметр игнорируется, если параметрrecursiveне равенtrue. По умолчанию:0. -
recursive<boolean> Если значение равноtrue, выполняется рекурсивное удаление. В рекурсивном режиме при сбое операции повторяются. По умолчанию:false. -
retryDelay<integer> Время ожидания между повторными попытками в миллисекундах. Параметр игнорируется, если параметрrecursiveне равенtrue. По умолчанию:100.
-
-
callback<Function>-
err<Error>
-
Асинхронно удаляет файлы и каталоги (по образцу стандартной утилиты POSIX rm). В callback завершения передаются только аргументы, необходимые для возможного исключения.
fs.stat(path[, options], callback)
-
path<string> | <Buffer> | <URL> -
options<Object>-
bigint<boolean> Должны ли числовые значения в возвращаемом объекте <fs.Stats> иметь типbigint. По умолчанию:false.
-
-
callback<Function>-
err<Error> -
stats<fs.Stats>
-
Асинхронный вызов stat(2). Callback получает два аргумента (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 copy
Следующая программа проверит статистику для указанных путей:
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);
});
} copy Результат будет выглядеть примерно так:
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
}
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
} copy
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. Callback получает два аргумента (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); copy Приведённый выше пример создаёт символическую ссылку mewtwo, которая указывает на mew в том же каталоге:
$ tree . . ├── mew └── mewtwo -> ./mew copy
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');
}); copy 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. -
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
Передача аргумента 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');
}
}); copy
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}`);
}); copy Эти объекты 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!');
}); copy Если options — это строка, она задает кодировку:
import { writeFile } from 'node:fs';
writeFile('message.txt', 'Hello Node.js', 'utf8', callback); copy Небезопасно использовать 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(); copy Отмена выполняющегося запроса не отменяет отдельные запросы операционной системы, а прекращает внутреннюю буферизацию, выполняемую 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); copy Отличие от прямого вызова 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>-
err<Error> -
bytesWritten<integer> -
buffers<ArrayBufferView[]>
-
Записывает массив ArrayBufferViews в файл, указанный в fd, используя writev().
position — это смещение от начала файла, по которому следует записать данные. Если значение равно typeof position !== 'number', данные будут записаны в текущую позицию.
В callback передаются три аргумента: err, bytesWritten и buffers. bytesWritten — количество байтов, записанных из buffers.
Если для этого метода вызвать util.promisify(), он вернет промис для Object со свойствами bytesWritten и buffers.
Небезопасно использовать fs.writev() несколько раз для одного и того же файла, не дожидаясь callback. В этом случае используйте 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!');
} copy
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 */
} copy Если options — строка, она задаёт кодировку:
import { appendFileSync } from 'node:fs';
appendFileSync('message.txt', 'data to append', 'utf8'); copy В качестве 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);
} copy
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); copy
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.'); copy
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.globSync(pattern[, options])
-
pattern<string> | <string[]> -
options<Object>-
cwd<string> | <URL> текущий рабочий каталог. По умолчанию:process.cwd() -
exclude<Function> | <string[]> Функция для фильтрации файлов и каталогов или список шаблонов glob, которые нужно исключить. Если указана функция, вернитеtrue, чтобы исключить элемент, иfalse, чтобы включить его. По умолчанию:undefined. -
withFileTypes<boolean>true, если шаблон glob должен возвращать пути в виде объектов Dirent, иfalseв противном случае. По умолчанию:false.
-
- Возвращает: <string[]> пути к файлам, соответствующим шаблону.
Модули JavaScript
import { globSync } from 'node:fs';
console.log(globSync('**/*.js'));CommonJS
const { globSync } = require('node:fs');
console.log(globSync('**/*.js'));
fs.lchmodSync(path, mode)
Изменяет разрешения символической ссылки. Возвращает 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<Object>-
encoding<string> По умолчанию:'utf8'
-
- Возвращает: <Object> Объект с возможностью освобождения ресурсов:
-
path<string> Путь к созданному каталогу. -
remove<Function> Функция, удаляющая созданный каталог. -
[Symbol.dispose]<Function> То же, что иremove.
-
Возвращает объект с возможностью освобождения ресурсов, свойство path которого содержит путь к созданному каталогу. При освобождении ресурсов объекта каталог и его содержимое будут удалены, если они еще существуют. Если каталог нельзя удалить, при освобождении ресурсов будет выброшена ошибка. Объект имеет метод remove(), выполняющий ту же задачу.
Подробную информацию см. в документации к fs.mkdtemp().
Для этого API нет версии с обратным вызовом, поскольку он предназначен для использования с синтаксисом using.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, указывающим используемую кодировку символов.
fs.opendirSync(path[, options])
Синхронно открывает каталог. См. 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> copy
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).
Поддерживаются только пути, которые можно преобразовать в строки UTF8.
Необязательный аргумент options может быть строкой, задающей кодировку, или объектом со свойством encoding, задающим кодировку символов для возвращаемого пути. Если для encoding установлено значение 'buffer', возвращаемый путь будет передан в виде объекта <Buffer>.
В Linux, если Node.js скомпонован с musl libc, для работы этой функции файловая система procfs должна быть смонтирована в /proc. Для Glibc такого ограничения нет.
fs.rmdirSync(path[, options])
-
path<string> | <Buffer> | <URL> -
options<Object>-
maxRetries<integer> Если возникает ошибкаEBUSY,EMFILE,ENFILE,ENOTEMPTYилиEPERM, Node.js повторяет операцию, каждый раз увеличивая интервал линейной задержки наretryDelayмиллисекунд. Этот параметр задаёт количество повторных попыток. Этот параметр игнорируется, если параметрrecursiveне равенtrue. По умолчанию:0. -
recursive<boolean> Если значениеtrue, выполняется рекурсивное удаление каталога. В рекурсивном режиме при сбое операции повторяются. По умолчанию:false. Устарело. -
retryDelay<integer> Время ожидания между повторными попытками в миллисекундах. Этот параметр игнорируется, если параметрrecursiveне равенtrue. По умолчанию:100.
-
Синхронный вызов 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илиEPERM, Node.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.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);
} copy При использовании асинхронного итератора объект <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> 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.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 ...>
}
}); copy Событие: '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> «привязаны», поэтому обычно вызывать 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> «привязаны», поэтому обычно вызывать 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.path
Путь к файлу, из которого поток выполняет чтение, указанный в первом аргументе fs.createReadStream(). Если path передан как строка, то readStream.path будет строкой. Если path передан как <Buffer>, то readStream.path будет объектом <Buffer>. Если указан fd, то readStream.path будет undefined.
readStream.pending
- Тип: <boolean>
Это свойство имеет значение true, если базовый файл ещё не открыт, то есть до генерации события 'ready'.
Class: 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,
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 } copy Версия 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,
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 } copy
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.isSymbolicLink()
- Возвращает: <boolean>
Возвращает true, если объект <fs.Stats> описывает символическую ссылку.
Этот метод применим только при использовании fs.lstat().
stats.uid
Числовой идентификатор пользователя, которому принадлежит файл (POSIX).
stats.rdev
Числовой идентификатор устройства, если файл представляет собой устройство.
stats.size
Размер файла в байтах.
Если используемая файловая система не поддерживает получение размера файла, значением будет 0.
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.
Значения времени Stat
Свойства atimeMs, mtimeMs, ctimeMs, birthtimeMs — это числовые значения, содержащие соответствующее время в миллисекундах. Их точность зависит от платформы. Если в метод, создающий объект, передан параметр bigint: true, значения свойств будут иметь тип bigint, в противном случае они будут иметь тип number.
Свойства atimeNs, mtimeNs, ctimeNs, birthtimeNs — это значения типа bigint, содержащие соответствующее время в наносекундах. Они присутствуют только в том случае, если в метод, создающий объект, передан параметр bigint: true. Их точность зависит от платформы.
atime, mtime, ctime и birthtime — это альтернативные представления различных значений времени в виде объектов Date. Значения Date и типа number не связаны между собой. Присвоение нового числового значения или изменение значения 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 оно также устанавливается, если дляatimeявно задаётся значение, предшествующее текущемуbirthtime, с помощью системного вызоваutimes(2).
До Node.js 0.12 в системах Windows ctime содержало значение birthtime. Начиная с версии 0.12, ctime не является «временем создания»; в системах Unix оно никогда им не было.
Класс: fs.StatFs
Предоставляет информацию о смонтированной файловой системе.
Объекты, возвращаемые функцией fs.statfs() и её синхронным аналогом, имеют этот тип. Если в параметре options, переданном этим методам, значение bigint равно true, вместо number числовые значения будут иметь тип bigint.
StatFs {
type: 1397114950,
bsize: 4096,
blocks: 121938943,
bfree: 61058895,
bavail: 61058895,
files: 999,
ffree: 1000000
} copy Версия bigint:
StatFs {
type: 1397114950n,
bsize: 4096n,
blocks: 121938943n,
bfree: 61058895n,
bavail: 61058895n,
files: 999n,
ffree: 1000000n
} copy
statfs.bavail
Свободные блоки, доступные непривилегированным пользователям.
Класс: fs.Utf8Stream
Оптимизированный поток записи 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> Вызывать flush каждые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.periodicFlush
-
<number> Интервал между сбросами в миллисекундах. Если указано значение
0, периодические сбросы выполняться не будут.
utf8Stream.reopen(file)
Повторно открывает файл на месте; полезно при ротации журналов.
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) => {
// ...
}); copy Константы доступа к файлам
Следующие константы предназначены для использования в качестве параметра 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)}`);
}); copy Важно правильно упорядочить операции: дождаться результатов одной операции, прежде чем вызывать другую:
Модули 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();
} copy Пример с относительным путём в 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();
} copy Пути URL файлов
Для большинства функций модуля node:fs аргумент path или filename можно передать в виде объекта <URL> с использованием протокола file:.
import { readFileSync } from 'node:fs';
readFileSync(new URL('file:///tmp/hello')); copy 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 copy Объекты <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')); copy Объект <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 */ copy В 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 */ copy Пути 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();
} copy Рабочие каталоги для каждого диска в 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;
}
}); copy В 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();
} copy Использование пула потоков
Все 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>
}); copy В 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/dist/latest-v24.x/docs/api/fs.html