Я пытался найти способ записи в файл при использовании Node.js, но безуспешно. Как я могу это сделать?
1646
Есть много деталей в API файловой системы . Наиболее распространенный способ:
const fs = require('fs');
fs.writeFile("/tmp/test", "Hey there!", function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
// Or
fs.writeFileSync('/tmp/test-sync', 'Hey there!');
{ [Error: EACCES, open '/home/test.txt'] errno: 3, code: 'EACCES', path: '/home/test.txt' }
Как я могу изменить этот скрипт, чтобы он работал вне/tmp
?/home/...
. Обычно этот каталог - 755 root: wheel (или любой другой). Если узел хочет записать файл как jane, его будет проще записать/home/jane/test.txt
. Переход/home
на что-то более разрешительное, чем 755, является огромной ошибкой./home
каталоге, я предложил chmod его. Я знаю, что это может создать проблему безопасности. Но хорошо, если пользователь хочет сохранить там, это решение. PS: Я согласен с тем, что вы сказали (:В настоящее время существует три способа записи файла:
fs.write(fd, buffer, offset, length, position, callback
)Вам нужно дождаться обратного вызова, чтобы убедиться, что буфер записан на диск. Это не буферизовано.
fs.writeFile(filename, data, [encoding], callback)
Все данные должны храниться одновременно; Вы не можете выполнять последовательные записи.
fs.createWriteStream(path, [options]
)Создает
WriteStream
, что удобно, потому что вам не нужно ждать обратного вызова. Но опять же, это не буферизовано.А
WriteStream
, как следует из названия, это поток. Поток по определению - это «буфер», содержащий данные, которые перемещаются в одном направлении (источник ► назначение). Но записываемый поток не обязательно «буферизуется». Поток «буферизуется», когда вы записываетеn
время, и время от времениn+1
поток отправляет буфер ядру (потому что он заполнен и его необходимо очистить).Другими словами: «Буфер» - это объект. Является ли он буферизованным или нет, является свойством этого объекта.
Если вы посмотрите на код, он
WriteStream
наследуется отStream
объекта, доступного для записи . Если вы обратите внимание, вы увидите, как они сбрасывают контент; у них нет никакой системы буферизации.Если вы пишете строку, она преобразуется в буфер, а затем отправляется на собственный слой и записывается на диск. При написании строк они не заполняют какой-либо буфер. Итак, если вы делаете:
Ты делаешь:
Это три вызова на уровне ввода / вывода. Хотя вы используете «буферы», данные не буферизируются. Буферизованный поток будет выполнять:
fs.write(new Buffer ("abc"))
один вызов уровня ввода / вывода.На данный момент в Node.js v0.12 (стабильная версия объявлена 06/06/2015) теперь поддерживаются две функции:
cork()
иuncork()
. Кажется, что эти функции, наконец, позволят вам буферизовать / сбрасывать вызовы записи.Например, в Java есть некоторые классы, которые предоставляют буферизованные потоки (
BufferedOutputStream
,BufferedWriter
...). Если вы записываете три байта, эти байты будут храниться в буфере (памяти) вместо того, чтобы выполнять вызов ввода-вывода только для трех байтов. Когда буфер заполнен, содержимое сбрасывается и сохраняется на диск. Это улучшает производительность.Я ничего не открываю, просто вспоминаю, как должен осуществляться доступ к диску.
источник
cork()
иuncork()
для тех из нас, кто хочет попробовать предварительный выпуск 0.11?npm
реализации буферизованной записи?Конечно, вы можете сделать его немного более продвинутым. Неблокирование, запись фрагментов, не запись всего файла сразу:
источник
Синхронная запись
Асинхронная запись
куда
Стоит прочитать в OFFICAL File System (фс) DOCS .
источник
источник
fs.write()
), этот пример работает, только если все достаточно коротко, чтобы быть записанным в одном вызове записи.Мне понравился индекс ./articles/file-system .
Это сработало для меня.
Смотрите также Как мне записать файлы в node.js? ,
Содержимое helloworld.txt:
Обновление:
Как и в случае с Linux-узлом, запись в текущую директорию кажется, что в некоторых других нет, поэтому я добавляю этот комментарий на всякий случай:
используя его,
ROOT_APP_PATH = fs.realpathSync('.'); console.log(ROOT_APP_PATH);
чтобы получить место, где записан файл.источник
Ответы предоставлены, и новый способ сделать это:
см документы здесь для получения дополнительной информации
источник
(node:23759) ExperimentalWarning: The fs.promises API is experimental
v10.15.0
Я знаю, что заданный вопрос о «записи», но в более общем смысле «добавление» может быть полезен в некоторых случаях, поскольку его легко использовать в цикле для добавления текста в файл (независимо от того, существует файл или нет). Используйте «\ n», если вы хотите добавить строки, например:
источник
const
вместоvar
, то естьconst fs = require('fs');
, чтобы избежать нежелательных побочных эффектов, особенно если вы работаете с несколько большей кодовой базой.Хорошо, это довольно просто , как Node имеет встроенные функциональные возможности для этого, это называется ,
fs
который стоит на файловой системе и в основном, NodeJS File System модуль ...Итак, сначала запишите это в вашем файле server.js следующим образом:
fs
имеет несколько методов для записи в файл, но я предпочитаю использовать способappendFile
, который добавит материал в файл, и если файл не существует, создаст его, код может быть таким, как показано ниже:источник
Например: прочитать файл и записать в другой файл:
источник
writeFile
?Вы можете записать в файл, используя модуль fs (файловая система).
Вот пример того, как вы можете это сделать:
Возможно, вы также захотите избавиться от этой структуры кода callback-inside-callback с помощью Promises и
async
/await
операторов. Это сделает асинхронную структуру кода намного более плоской. Для этого может быть использована удобная функция util.promisify (original) . Это позволяет нам переключаться с обратных вызовов на обещания. Взгляните на пример сfs
функциями ниже:источник
Здесь мы используем w + для чтения / записи обоих действий, и если путь к файлу не найден, он будет создан автоматически.
Контент означает, что вы должны записать в файл и его длину, «content.length».
источник
Вот пример того, как прочитать файл CSV из локального и записать файл CSV в локальный.
источник
После прочтения этой длинной статьи. Вы должны понимать, как это работает. Итак, вот пример
createWriteStream()
.источник
createWriteStream
уже упоминалось в нескольких ответах за годы до этого.Вы можете использовать библиотеку
easy-file-manager
установить сначала с npm
npm install easy-file-manager
Образец для загрузки и удаления файлов
источник
This modules is created to save and remove files.
, Не ответВы можете записать в файл следующий пример кода:
источник
writeFile
несколько лет назад уже давали ответ несколько раз. Что добавляет этот ответ?