Я пытаюсь создать полный путь, если он не существует.
Код выглядит так:
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest);
Этот код прекрасно работает, пока существует только один подкаталог (newDest, например, 'dir1'), однако при наличии пути к каталогу ('dir1 / dir2') он завершается с ошибкой: ENOENT, такого файла или каталога нет
Я хотел бы иметь возможность создать полный путь с минимальным количеством строк кода.
Я читал, что есть рекурсивный вариант на фс и попробовал вот так
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest,'0777', true);
Я чувствую, что рекурсивно создать каталог, который не существует, настолько просто. Я что-то пропустил или мне нужно проанализировать путь, проверить каждый каталог и создать его, если он еще не существует?
Я довольно новичок в Node. Может я использую старую версию ФС?
Ответы:
Одним из вариантов является использование модуля shelljs
npm установить shelljs
С этой страницы:
Как уже отмечали другие, есть и другие, более сфокусированные модули. Но, кроме mkdirp, у него есть множество других полезных операций оболочки (например, которые, grep и т. Д.), И он работает на windows и * nix
источник
редактировать
Версия NodeJS
10.12.0
добавила встроенную поддержку для обоихmkdir
иmkdirSync
для рекурсивного создания каталога сrecursive: true
опцией, как указано ниже:И если вы предпочитаете
fs Promises API
, вы можете написатьОригинальный ответ
Создавайте каталоги рекурсивно, если их не существует! ( Нулевые зависимости )
использование
демонстрация
Попытайся!
Пояснения
EISDIR
для платформы ошибки, как для Mac, такEPERM
иEACCES
для Windows. Благодаря всем отчетным комментариям @PediT., @JohnQ, @ deed02392, @robyoder и @Almenon.{isRelativeToScript: true}
.path.sep
аpath.resolve()
не просто/
конкатенация, чтобы избежать кроссплатформенных проблем.fs.mkdirSync
и обработка ошибок сtry/catch
если брошено обрабатывать условия гонки: другой процесс может добавить файл между вызовамиfs.existsSync()
иfs.mkdirSync()
и вызывает исключение.if (!fs.existsSync(curDir) fs.mkdirSync(curDir);
. Но это анти-паттерн, который делает код уязвимым для условий гонки. Благодаря @GershomMaes комментарий о проверке существования каталога.источник
Более надежный ответ - использовать команду mkdirp .
Затем перейдите к записи файла в полный путь с помощью:
источник
fs-extra добавляет методы файловой системы, которые не включены в собственный модуль fs. Это капля замены фс.
устанавливать
fs-extra
$ npm install --save fs-extra
Есть варианты синхронизации и асинхронности.
https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureDir.md
источник
memfs
для модульного тестирования. Это не так :-( github.com/jprichardson/node-fs-extra/issues/274Используя Reduce, мы можем проверить, существует ли каждый путь, и создать его, если это необходимо, и таким образом, я думаю, легче следовать. Отредактировано, спасибо @Arvin, мы должны использовать path.sep, чтобы получить подходящий для платформы разделитель сегментов пути.
источник
Эта функция была добавлена в node.js в версии 10.12.0, так что это так же просто, как передать параметр в
{recursive: true}
качестве второго аргументаfs.mkdir()
вызова. Смотрите пример в официальных документах .Нет необходимости во внешних модулях или вашей собственной реализации.
источник
я знаю, что это старый вопрос, но nodejs v10.12.0 теперь поддерживает это изначально с
recursive
параметром true. fs.mkdirисточник
Теперь с NodeJS> =
10.12.0
вы можете использоватьfs.mkdirSync(path, { recursive: true })
fs.mkdirSyncисточник
Пример для Windows (без дополнительных зависимостей и обработки ошибок)
источник
Вы можете просто проверить, существует ли папка или нет в пути, и создать папку, если вы проверите, нет ли ее в папке. ( НЕТ ВНЕШНЕЙ БИБЛИОТЕКИ )
источник
Вы можете использовать следующую функцию
const recursiveUpload = (путь: строка) => {const paths = путь.split ("/")
Итак, что он делает:
paths
переменную, где он хранит каждый путь отдельно как элемент массива.Надеюсь, это поможет!
Кстати, в Node v10.12.0 вы можете использовать рекурсивное создание пути, задав его в качестве дополнительного аргумента.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => { if (err) throw err; });
https://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_options
источник
Слишком много ответов, но вот решение без рекурсии, которое работает, разделяя путь, а затем восстанавливая его слева направо
Для тех, кто обеспокоен совместимостью Windows и Linux, просто замените прямую косую черту на двойную обратную косую черту '\' в обоих случаях выше, но TBH, мы говорим о узле fs, а не командной строке Windows, и первый довольно прост, и приведенный выше код будет просто работать на Windows и более полное решение кроссплатформенное.
источник
path.sep
проходит как либо / или \\ для меня.path.delimiter
это: или;источник
Асинхронный способ рекурсивного создания каталогов:
источник
Вот моя обязательная версия
mkdirp
для nodejs.источник
Как насчет этого подхода:
Это работает для относительного пути.
источник
Основываясь на ответе нулевых зависимостей от mouneer , вот несколько более дружественный для начинающих
Typescript
вариант, как модуль:источник
Как чисто, как это :)
источник
У меня были проблемы с рекурсивной опцией fs.mkdir, поэтому я сделал функцию, которая делает следующее:
Делает каждый каталог необходимым, включая финальный
источник
Exec может быть грязно на окнах. Есть более «навязчивое» решение. По сути, у вас есть рекурсивный вызов, чтобы увидеть, существует ли каталог, и погрузиться в него (если он существует) или создать его. Вот функция, которая создаст потомков и вызовет функцию, когда закончите:
}
источник
Эта версия работает лучше в Windows, чем в верхнем ответе, потому что она понимает и то,
/
иpath.sep
другое, поэтому косые черты работают в Windows так, как они должны. Поддерживает абсолютные и относительные пути (относительноprocess.cwd
).источник