Fs.write() против fs.writeFile() против fs.appendFile()

В чем разница между fs.write(), fs.writeFile() и fs.appendFile()?

У меня возникли проблемы с пониманием, в чем именно разница между этими тремя методами, потому что для меня они в конечном итоге выглядят одинаково или, скорее, как ярлыки друг для друга.

Судя по базовому описанию fs.write() и fs.writeFile() они кажутся одинаковыми, заметные различия заключаются в количестве параметров, у fs.writeFile() их больше. Но тогда в описании fs.writeFile() написано

Подобно fs.readFile, fs.writeFile — это удобный метод, который выполняет несколько внутренних вызовов записи для записи переданного в него буфера.

Значит, это просто более быстрый и автоматический способ вызова нескольких fs.write()? Это подводит нас к fs.appendFile(), потому что это похоже на ярлык для fs.writeFile() с установленным флагом a. Единственное отличие, которое я вижу, — это установленные по умолчанию флаги и количество типов, которые вы можете использовать для data.

Тогда бы тоже был fs.createWriteStream(), но он явно различается несколькими способами и имеет другой вариант использования, чем методы write(), например, регистратор, который должен писать быстро и часто, так что я вижу разницу.

fs.write кажется низкоуровневым API, похожим на то, как языки программирования, такие как C, обрабатывают файлы. fs.writeFile разделяет данные для вас и сохраняет их
Konrad 11.04.2024 15:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
303
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первым аргументом fs.write() должен быть дескриптор файла, который будет предоставлен fs.open, но fs.writeFile() может принимать дескриптор файла или путь к файлу. Также в документах упоминается

Использование fs.writeFile() с файловыми дескрипторами

Отличие от прямого вызова fs.write() заключается в том, что при некоторых необычных условиях fs.write() может записать только часть буфера, и его потребуется повторить для записи оставшихся данных, тогда как fs.writeFile() повторяет попытки до тех пор, пока данные не будут сохранены. написано целиком (или возникает ошибка).

fs.appendFile(), потому что это похоже на ярлык для fs.writeFile() с установленным флагом a. Единственное отличие, которое я вижу, — это установленные по умолчанию флаги и количество типов, которые вы можете использовать для данных.

Да, вот источник fs.appendFile

// below function is output of process.stdout.write(fs.appendFile.toString())

function appendFile(path, data, options, callback) {
  callback = maybeCallback(callback || options);
  options = getOptions(options, { encoding: 'utf8', mode: 0o666, flag: 'a' });

  // Don't make changes directly on options object
  options = copyObject(options);

  // Force append behavior when using a supplied file descriptor
  if (!options.flag || isFd(path))
    options.flag = 'a';

  fs.writeFile(path, data, options, callback);
}

Откуда этот фрагмент?

Konrad 11.04.2024 15:38

@Конрад, просто вставь это в строку узла REPL process.stdout.write(fs.appendFile.toString()). Вы можете просмотреть тело функции JavaScript, преобразовав его в строку. Он работает только для функций чистого js, но некоторые встроенные функции написаны на C++, где он не будет работать.

bogdanoff 11.04.2024 15:42

То есть, по сути, fs.writeFile основывается на fs.write() с большим количеством параметров и типов параметров? А если вы вызовете appendFile с флагом w, это будет то же самое, что writeFile?

GreenSaiko 11.04.2024 16:19

@GreenSaiko fs.writeFile — это fs.write с дополнительными шагами, обеспечивающими запись буфера, я рекомендую использовать fs.writeFile, используйте fs.write(), если вы знаете, что делаете.

bogdanoff 11.04.2024 17:28

@GreenSaiko Нет appendFile с флагом w не будет работать как writeFile, поскольку в функции appendFIle есть строка, которая переопределяет флаг с помощью 'a'. (это во фрагменте, которым я поделился)

bogdanoff 11.04.2024 17:30

@bogdanoff Я видел эту строку, но разве она не применима только тогда, когда мы либо не устанавливаем флаги, либо вызываем appendFile с дескриптором файла? Итак, вызов его с флагом «w» и использование пути не следует переопределять, верно?

GreenSaiko 12.04.2024 09:10

@GreenSaiko нет, не эта строка, третья строка в теле функции с вызовом getOptions. getOptions ~~берёт два объекта и объединяет их, переопределяя параметр флага~~ . Я думаю, вы все еще правы, только что посмотрел определение getOptions, и оно не объединяет параметры, поэтому передача с флагом 'w' не будет переопределена, я думаю, таким образом, действуя как fs.writeFile вместо fs.appendFile.

bogdanoff 12.04.2024 09:23

Другие вопросы по теме