Я уже прочитал документацию по Node.js и, если я что-то пропустил, он не сообщает, какие параметры содержатся в определенных операциях, в частности fs.mkdir()
. Как видно из документации, это не очень много.
В настоящее время у меня есть этот код, который пытается создать папку или использовать вместо нее существующую:
fs.mkdir(path,function(e){
if(!e || (e && e.code === 'EEXIST')){
//do something with contents
} else {
//debug
console.log(e);
}
});
Но мне интересно, это правильный способ сделать это? Является ли проверка кода EEXIST
правильным способом узнать, что папка уже существует? Я знаю, что могу сделать fs.stat()
до создания каталога, но это уже будет два попадания в файловую систему.
Во-вторых, есть ли полная или, по крайней мере, более подробная документация по Node.js, которая содержит подробную информацию о том, что содержат объекты ошибок, что означают параметры и т. Д.
источник
e &&
. Если!e
неe
получится , значит, ты правдива.Ответы:
Хороший способ сделать это - использовать модуль mkdirp .
Используйте его для запуска функции, которая требует каталог. Обратный вызов вызывается после создания пути или, если путь уже существует. Ошибка
err
устанавливается, если mkdirp не удалось создать путь к каталогу.источник
fs.exists(Sync)
.Изменить: Поскольку этот ответ очень популярен, я обновил его, чтобы отразить современные практики.
Узел> = 10
Новая
{ recursive: true }
опция Node'sfs
теперь позволяет это изначально. Эта опция имитирует поведение UNIXmkdir -p
. Он рекурсивно удостоверится, что каждая часть пути существует, и не выдаст ошибку, если какая-либо из них сделает.(Примечание: он может по-прежнему выдавать ошибки, такие как
EPERM
илиEACCESS
, поэтому лучше обернуть его вtry {} catch (e) {}
если ваша реализация подвержена этому.)Синхронная версия.
Асинхронная версия
Старые версии Node
Используя
try {} catch (err) {}
, вы можете достичь этого очень изящно, не встречая условия гонки.Чтобы предотвратить потерю времени между проверкой существования и созданием каталога, мы просто пытаемся создать его прямо вверх и игнорировать ошибку, если она есть.
EEXIST
(каталог уже существует).Если ошибка не
EEXIST
, однако, мы должны выбросить ошибку, потому что мы могли бы иметь дело с чем-то вродеEPERM
илиEACCES
Для
mkdir -p
-like рекурсивного поведения, например./a/b/c
, вы должны были бы назвать его на каждой части dirpath, например./a
,./a/b
,.a/b/c
источник
Если вы хотите быстрый и грязный лайнер, используйте это:
источник
fs.exists
устарело: nodejs.org/api/fs.html#fs_fs_exists_path_callbackДокументы по node.js для по
fs.mkdir
существу относятся к справочной странице по Linux дляmkdir(2)
. Это означает, чтоEEXIST
также будет указано, если путь существует, но не является каталогом, который создает неудобный угловой случай, если вы идете по этому пути.Возможно, вам лучше позвонить,
fs.stat
чтобы узнать, существует ли путь и является ли он каталогом за один вызов. Для (что я предполагаю, что) нормальный случай, когда каталог уже существует, это всего лишь один удар по файловой системе.Эти
fs
методы модуля являются тонкими оболочками вокруг собственных API-интерфейсов C, поэтому вы должны проверить подробности в справочных страницах, на которые есть ссылки в документации по node.js.источник
stat
до того,mkdir
как это может привести к состоянию гонки, имейте это в виду.Вы можете использовать это:
источник
statSync
выдаст ошибку, если сущность вообще не существует , что приведет к сбою кода. Вы должны обернуть это вtry/catch
блоке.fs.existsSync()
иfs.exists()
будет объявлено устаревшим.Я предлагаю решение без модулей (накапливать модули никогда не рекомендуется для удобства обслуживания, особенно для небольших функций, которые можно записать в несколько строк ...):
ПОСЛЕДНЕЕ ОБНОВЛЕНИЕ :
В v10.12.0 NodeJS реализует рекурсивные опции:
ОБНОВИТЬ :
источник
fs.exists()
устарела в узле v9. используйтеfs.access()
вместо этого. (возвращает,undefined
если файл существует; в противном случае выдает ошибкуENOENT
)fs.mkdirSync('my/new/folder/create', {recursive: true})
?Вы также можете использовать fs-extra , который предоставляет много часто используемых файловых операций.
Образец кода:
документы здесь: https://github.com/jprichardson/node-fs-extra#mkdirsdir-callback
источник
Вот код ES6, который я использую для создания каталога (когда он не существует):
Примечание:
createDirectory
функции я нормализую путь, чтобы гарантировать, что тип разделителя пути операционной системы будет использоваться последовательно (например, это превратитсяC:\directory/test
вC:\directory\test
(при работе в Windows)fs.exists
является устаревшим , поэтому я использую ,fs.stat
чтобы проверить , если каталог уже существуетENOENT
( E rror NO ENT ry)fs.mkdir
fs.mkdir
сравнению с ее блокирующим аналогом,fs.mkdirSync
и из-за переносаPromise
будет гарантировано, что путь к каталогу будет возвращен только после успешного создания каталогаисточник
На мой взгляд, вам лучше не считать хиты файловой системы при написании кода на Javascript. Тем не менее, (1)
stat
иmkdir
и (2)mkdir
и проверьте (или отбросьте) код ошибки, оба способа являются правильными способами сделать то, что вы хотите.источник
источник
Вы можете сделать все это с модулем файловой системы.
Вам действительно даже не нужно проверять, существует ли каталог. Следующий код также гарантирует, что каталог уже существует или создан.
источник
Ответ Раугарала, но с функциональностью -p. Некрасиво, но работает
источник
Так же, как более новая альтернатива ответу Teemu Ikonen , который очень прост и легко читаем, это использование
ensureDir
методаfs-extra
пакета.Он может быть использован не только как явная замена встроенному
fs
модулю, но также обладает множеством других функций в дополнение к функциональностиfs
пакета.ensureDir
Метод, как следует из названия, гарантирует , что каталог существует. Если структура каталогов не существует, она создается. Какmkdir -p
. Не только конечная папка, но и весь путь, если он еще не создан.приведенная выше
async
версия является его версией. У этого также есть синхронный метод, чтобы выполнить это в формеensureDirSync
метода.источник
Ответ @ Liberateur выше не работал для меня (Node v8.10.0). Небольшая модификация сделала свое дело, но я не уверен, что это правильный путь. Пожалуйста, предложите.
источник