В моем приложении Node мне нужно удалить каталог, в котором есть несколько файлов, но который fs.rmdir
работает только с пустыми каталогами. Как я могу это сделать?
node.js
filesystems
Сэчин
источник
источник
fs.readdir(dirPath)
для массива путей в папке выполните итерацию,fs.unlink(filename)
чтобы удалить каждый файл, а затем, наконец,fs.rmdir(dirPath)
удалить пустую папку. Если вам нужно пройти курс, проверьтеfs.lstat(filename).isDirectory()
.Ответы:
Для этого есть модуль
rimraf
( https://npmjs.org/package/rimraf ). Он обеспечивает ту же функциональность, что иrm -Rf
Асинхронное использование:
Синхронизация использования:
источник
deleteFolderRecursive
в следующем ответе?recursive
опцию: stackoverflow.com/a/57866165/6269864Удалить папку синхронно
источник
var curPath = path + "/" + file;
сvar curPath = p.join(path, file);
условием , что вы включили модуль пути:var p = require("path")
path.join(dirpath, file)
должно быть лучшеpath + "/" + file
Большинство людей, использующих
fs
Node.js, хотели бы, чтобы функции были близки к «Unix-способу» работы с файлами. Я использую fs-extra, чтобы принести все классные вещи:Более того, fs-extra - капля на замену нативным fs. Все методы в fs не изменены и привязаны к нему. Это означает, что вы можете заменить fs на fs-extra :
И тогда вы можете удалить папку следующим образом:
источник
removeSync('/tmp/myFolder')
По состоянию на 2019 год ...
Начиная с Node.js 12.10.0 ,
fs.rmdirSync
поддерживаетrecursive
параметры, так что вы можете, наконец, сделать:Где
recursive
опция рекурсивно удаляет весь каталог.источник
recursive: true
и удаляет непустые папки без жалоб.fs.rmdir(path[, options], callback)
илиfs.rmdirSync(path[, options])
fs.rmdir
оно экспериментально со стабильностью 1. «Стабильность: 1 - экспериментально. Эта функция не подпадает под правила семантического контроля версий. Изменения или удаление, несовместимые с предыдущими версиями, могут произойти в любом случае. будущий выпуск. Использование этой функции в производственных средах не рекомендуется ».Мой измененный ответ от @oconnecp ( https://stackoverflow.com/a/25069828/3027390 )
Использует path.join для лучшего кроссплатформенного опыта. Так что не забывайте требовать этого.
Также переименован в функцию
rimraf
;)источник
Я обычно не воскрешаю старые темы, но здесь есть много чего, и без ответа, все это кажется мне слишком сложным.
Во-первых, в современном Node (> = v8.0.0) вы можете упростить процесс, используя только основные модули узла, полностью асинхронные, и распараллеливать параллельное связывание файлов одновременно в функции из пяти строк и при этом сохранять читабельность:
С другой стороны, защита для атак обхода пути не подходит для этой функции, потому что
rm -rf
в том, что она принимает аргумент и позволяет пользователю,rm -rf /
если будет предложено. Сценарий должен защищать неrm
саму программу..isDirectory()
этоfalse
для SYM-ссылок и НЕСВЯЗАННЫЕ не рекурсия в.И последнее, но не менее важное: существует редкое условие состязания, при котором рекурсия может привести к ошибке, если одна из записей была отсоединена или удалена вне этого сценария как раз в нужное время во время выполнения этой рекурсии. Поскольку этот сценарий не является типичным в большинстве сред, его, вероятно, можно пропустить. Однако, если требуется (для некоторых крайних случаев), эта проблема может быть смягчена с помощью этого немного более сложного примера:
РЕДАКТИРОВАТЬ: сделать
isDirectory()
функцию. Удалите актуальный каталог в конце. Исправить пропущенную рекурсию.источник
await
по своемуPromise.all(…)
; это намеренно? Кажется, что в его текущем состоянииresults.forEach
итерации по обещаниям, в то время как код ожидает итерации по результатам. Я что-то упускаю?if (!fs.existsSync(dir)) return
readdir
выдаст ошибку как надо. Если у васrmdir non-existing-dir
код выхода, это ошибка. Это будет обязанностью потребителя попробовать / поймать. Это тот же метод, который описан в документации по Node, когда дело доходит до использования функций fs. Они ожидают, что вы попробуете / поймаете и посмотрите на ошибки,code
чтобы определить, что делать. Дополнительная проверка вводит условия гонки.fs.exists
. PS это отличное решение.Вот асинхронная версия ответа @ SharpCoder
источник
Я написал эту функцию под названием удалить папку. Он рекурсивно удалит все файлы и папки в определенном месте. Единственный пакет, который требуется, это асинхронный.
источник
Если вы используете узел 8+, хотите асинхронность и не хотите внешних зависимостей, вот версия async / await:
источник
Асинхронная версия ответа @ SharpCoder с использованием fs.promises:
источник
Я достиг здесь, пытаясь покончить с этим,
gulp
и я пишу для дальнейших достижений.gulp-clean
не рекомендуется дляgulp-rimraf
gulp-rimraf
не рекомендуется в пользуdelete-files-folders
Если вы хотите удалить файлы и папки, используя
del
, вы должны добавить/**
для рекурсивного удаления.источник
Пакет де-факто есть
rimraf
, но вот моя крошечная асинхронная версия:источник
В последней версии Node.js (12.10.0 или более поздняя версия), то
rmdir
функция стиляfs.rmdir()
,fs.rmdirSync()
иfs.promises.rmdir()
есть новый экспериментальный вариант ,recursive
который позволяет удалять непустые каталоги, например ,Связанный PR на GitHub: https://github.com/nodejs/node/pull/29168
источник
Согласно
fs
документации , вfsPromises
настоящее время этаrecursive
опция предоставляется на экспериментальной основе, которая, по крайней мере, в моем случае в Windows, удаляет каталог и все файлы в нем.Удаляет ли
recursive: true
файлы на Linux и MacOS?источник
Сверхскоростной и безотказный
Вы можете использовать
lignator
пакет ( https://www.npmjs.com/package/lignator ), он быстрее любого асинхронного кода (например, rimraf) и более надежен (особенно в Windows, где удаление файлов происходит не мгновенно и файлы могут быть заблокирован другими процессами).источник
Синхронизировать папку удалить с файлами или только с файлом.
Я не большой даритель и не вкладчик, но я не смог найти хорошее решение этой проблемы, и мне пришлось найти свой путь ... так что я надеюсь, что вам понравится :)
Идеально подходит для меня с любым количеством вложенные каталоги и подкаталоги. Предостережение для области действия this при повторном использовании функции может отличаться от реализации. В моем случае эта функция остается в возвращении другой функции, поэтому я вызываю ее с этим.
источник
Пока
recursive
это экспериментальный вариантfs.rmdir
источник
2020 Обновление
С версии 12.10.0 для опций добавлен recursiveOption .
Обратите внимание, что рекурсивное удаление является экспериментальным .
Так что вы бы сделали для синхронизации:
или для асинхронного:
источник
Просто используйте модуль rmdir ! это легко и просто.
источник
Другой альтернативой является использование
fs-promise
модуля, который предоставляет обещанные версииfs-extra
модулейВы могли бы тогда написать как этот пример:
примечание: async / await требует последней версии nodejs (7.6+)
источник
Быстрый и грязный способ (возможно, для тестирования) может состоять в том, чтобы напрямую использовать метод
exec
orspawn
для вызова вызова ОС для удаления каталога. Узнайте больше о NodeJs child_process .Недостатками являются:
Преимущества:
источник
-f
флаг, чтобы быть безопасным, или удостовериться, печатая, что он / она не собирается удалять все.exec + rm
является верной и полезной командой в узле, которую я часто использую во время тестирования.Хотелось бы, чтобы был способ сделать это без дополнительных модулей для чего-то крошечного и общего, но это лучшее, что я мог придумать.
Обновление: теперь должно работать в Windows (проверено Windows 10), а также должно работать в системах Linux / Unix / BSD / Mac.
источник
child_process.execFile
которого не вызывать оболочку, а вместо этого явно передавайте аргументы.Это один из подходов, использующий Promisify и две вспомогательные функции (to и toAll) для разрешения обещания.
Это делает все действия асинхронными.
источник
// без использования каких-либо сторонних библиотек
источник
fs.unllinkSync(path.join(FOLDER_PATH, element);
источник