В чем разница между 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(), например, регистратор, который должен писать быстро и часто, так что я вижу разницу.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Первым аргументом 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);
}
Откуда этот фрагмент?
@Конрад, просто вставь это в строку узла REPL process.stdout.write(fs.appendFile.toString()). Вы можете просмотреть тело функции JavaScript, преобразовав его в строку. Он работает только для функций чистого js, но некоторые встроенные функции написаны на C++, где он не будет работать.
То есть, по сути, fs.writeFile основывается на fs.write() с большим количеством параметров и типов параметров? А если вы вызовете appendFile с флагом w, это будет то же самое, что writeFile?
@GreenSaiko fs.writeFile — это fs.write с дополнительными шагами, обеспечивающими запись буфера, я рекомендую использовать fs.writeFile, используйте fs.write(), если вы знаете, что делаете.
@GreenSaiko Нет appendFile с флагом w не будет работать как writeFile, поскольку в функции appendFIle есть строка, которая переопределяет флаг с помощью 'a'. (это во фрагменте, которым я поделился)
@bogdanoff Я видел эту строку, но разве она не применима только тогда, когда мы либо не устанавливаем флаги, либо вызываем appendFile с дескриптором файла? Итак, вызов его с флагом «w» и использование пути не следует переопределять, верно?
@GreenSaiko нет, не эта строка, третья строка в теле функции с вызовом getOptions. getOptions ~~берёт два объекта и объединяет их, переопределяя параметр флага~~ . Я думаю, вы все еще правы, только что посмотрел определение getOptions, и оно не объединяет параметры, поэтому передача с флагом 'w' не будет переопределена, я думаю, таким образом, действуя как fs.writeFile вместо fs.appendFile.
fs.writeкажется низкоуровневым API, похожим на то, как языки программирования, такие как C, обрабатывают файлы.fs.writeFileразделяет данные для вас и сохраняет их