Проект, над которым я работаю (node.js), предполагает много операций с файловой системой (копирование / чтение / запись и т. Д.). Я хотел бы знать, какие методы являются самыми быстрыми, и я был бы рад получить совет. Спасибо.
javascript
node.js
bonbonez
источник
источник
Ответы:
Это хороший способ скопировать файл в одну строку кода, используя потоки:
В узле v8.5.0 был добавлен copyFile
источник
createReadStream
иcreateWriteStream
ошибки, и ошибки, поэтому вы не получите однострочный (хотя это все равно будет так же быстро).cp test.log newLog.log
черезrequire('child_process').exec
?copy
, не является переносимым на Window, в отличие от полного решения Node.js.child_process.execFile('/bin/cp', ['--no-target-directory', source, target])
.fs.createReadStream('./init/xxx.json').pipe(fs.createWriteStream('xxx.json'));
Тот же механизм, но это добавляет обработку ошибок:
источник
WriteStream
будет только распаковать его. Тебе придется позвонитьrd.destroy()
самому себе. По крайней мере, так случилось со мной. К сожалению, есть не так много документации, кроме как из исходного кода.cb
стенд? что мы должны передать в качестве третьего аргумента?Я не смог заставить
createReadStream/createWriteStream
метод работать по какой-то причине, но с помощьюfs-extra
модуля npm он сразу заработал. Я не уверен в разнице в производительности, хотя.фс-экстра
npm install --save fs-extra
источник
fs.copy(src, dst, callback);
они должны решить проблему @ mvillar.Начиная с Node.js 8.5.0 у нас появились новые методы fs.copyFile и fs.copyFileSync .
Пример использования:
источник
copyFile()
ошибка при перезаписи более длинных файлов. Предоставленоuv_fs_copyfile()
Till Node v8.7.0 (libuv 1.15.0). см. github.com/libuv/libuv/pull/1552Быстро написать и удобно использовать, с обещаниями и управлением ошибками.
То же самое с синтаксисом async / await:
источник
new Promise(function(resolve, reject) { resolve(1); resolve(2); reject(3); reject(4); console.log("DONE"); }).then(console.log.bind(console), function(e){console.log("E", e);});
и посмотрел спецификацию по этому вопросу, и вы правы: Попытка разрешить или отклонить выполненное обещание не имеет никакого эффекта. Возможно, вы могли бы расширить свой ответ и объяснить, почему вы написали эту функцию таким образом? Спасибо :-)close
должно бытьfinish
для записываемых потоков./dev/stdin
, это ошибка github.com/joyent/node/issues/25375Ну, обычно хорошо избегать асинхронных файловых операций. Вот краткий (т.е. без обработки ошибок) пример синхронизации:
источник
*Sync
методов полностью противоречит философии nodejs! Я также думаю, что они медленно осуждаются. Вся идея nodejs заключается в том, что он однопоточный и управляемый событиями.Решение Майка Шиллинга с обработкой ошибок с ярлыком для обработчика событий ошибок.
источник
Если вас не интересует асинхронность, и вы не копируете файлы размером в гигабайт, и не хотите добавлять другую зависимость только для одной функции:
источник
fs.existsSync
Вызов должен быть опущен. Файл может исчезнуть во время междуfs.existsSync
вызовом иfs.readFileSync
вызовом, что означает, чтоfs.existsSync
вызов не защищает нас от чего-либо.false
еслиfs.existsSync
произошел сбой, вероятно, является плохой эргономикой, потому что немногие потребителиcopySync
будут думать, чтобы вручную проверять возвращаемое значение каждый раз, когда он вызывается , больше, чем мы делаем дляfs.writeFileSync
et al. , Бросать исключение на самом деле предпочтительнее.Это то, что я лично использую, чтобы скопировать файл и заменить другой файл, используя node.js :)
источник
Для быстрых копий вы должны использовать
fs.constants.COPYFILE_FICLONE
флаг. Это позволяет (для файловых систем, которые поддерживают это) фактически не копировать содержимое файла. Просто создается новая запись в файле, но она указывает на Copy-on-Write «клон» исходного файла .Ничего не делать - это самый быстрый способ что-то сделать;)
https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback
Вместо этого используйте обещания:
источник
fs.promises.copyFile
Решение Benweet, проверяющее видимость файла перед копированием:
источник
Почему бы не использовать nodejs, встроенный в функцию копирования?
Он предоставляет как асинхронную, так и синхронизированную версию:
https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags
источник
Решение Майка , но с обещаниями:
источник
Улучшение еще одного ответа.
Особенности:
promise
, что облегчает использование в большом проекте.Применение:
Код:
источник
все вышеупомянутые решения, которые не проверяют существование исходного файла, опасны ... например
в противном случае в сценарии существует риск, если источник и цель по ошибке будут заменены, ваши данные будут навсегда потеряны без замечания какой-либо ошибки.
источник