Я пытаюсь создать каталог со следующим кодом:
Dir.mkdir("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
unless File.exists?("/Users/Luigi/Desktop/Survey_Final/Archived/Survey/test")
Тем не менее, я получаю эту ошибку:
Нет такого файла или каталога - / Users / Luigi / Desktop / Survey_Final / Archived / Survey / test (Errno :: ENOENT)
Почему этот каталог не создается приведенным Dir.mkdir
выше заявлением?
File.exists?()
работает с файлами и папками. Это не знает разницу.Ответы:
Вы, вероятно, пытаетесь создать вложенные каталоги. Предполагая,
foo
что не существует, вы получитеno such file or directory
ошибку для:Для одновременного создания вложенных каталогов
FileUtils
необходимо:Edit2: вам не нужно использовать
FileUtils
, вы можете сделать системный вызов (обновление от @mu слишком короткий комментарий):Но это кажется (по крайней мере, мне) более худшим подходом, чем использование внешнего «инструмента», который может быть недоступен в некоторых системах (хотя я вряд ли могу представить систему без
mkdir
, но кто знает).источник
system 'mkdir', '-p', 'foo/bar'
будет лучшей версией этогоsystem
звонка. Нет необходимости в дополнительном процессе оболочки или обычной ерунде, заключающейся в кавычках / экранировании / инъекциях, которая поставляется с версией с одним аргументомsystem
.system
запустит/bin/sh
для разбораmkdir -p "foo/bar"
строки, а затем будет запущена оболочка/bin/mkdir
. Таким образом, вы выполняете дополнительную работу (создаете командную строку, запускаете/bin/sh
ее снова для разделения), и часть этой дополнительной работы оставляет вас открытыми для атак с использованием инъекций в оболочку (потратьте некоторое время на рекомендации CERT для Ruby, и вы увидите, как часто эта проблема есть).system
звонок лучше, чемfileutils
снова? Я работаю на Windows иmkdir_p
прекрасно работаю, не вызывая подоболочки, просто для анализа,mkdir -p
который в любом случае потерпит неудачу. Рад, чтоfileutils
это первая альтернатива в ответе.fileutils
илиmkdir_p
, все, что я говорю, это то, чтоsystem command, arg1, arg2, ...
лучше, чемsystem command_with_arguments
.Простой способ:
источник
Еще один простой способ:
Dir.mkdir('tmp/excel') unless Dir.exist?('tmp/excel')
источник
/home/jignesh/reports/test
но с помощью этого решения поднялRUBY (Errno::ENOENT), no such file or directory @ dir_s_mkdir
. Таким образом, надежное решение используетFileUtils.mkdir_p
Как насчет просто
Dir.mkdir('dir') rescue nil
?источник
rescue
в его форме модификатора.