Errno:: ENOENT: нет такого файла или каталога ruby
Я получаю следующую ошибку:
"Errno::ENOENT: No such file or directory"
когда я пытаюсь загрузить файл в каталог, который не существует.
Например:
ftp = Net::FTP.new('example.com')
ftp.login
files = ftp.chdir('pub/lang/ruby/contrib')
files = ftp.list('n*')
ftp.getbinaryfile('nif.rb-0.91.gz', 'pub/lang/ruby/contrib/nif.gz', 1024)
ftp.close
Однако для многих файлов, которые будут загружаться, полный путь к каталогу не будет существовать. Например, пока первый файл не создает паб, он не будет существовать, и это также относится к lang/ruby /contrib.
Есть ли метод, который может проверить, существуют ли каталоги и если они не созданы? Я знаю, что существует?, но это похоже на файлы ссылок и не создает полный путь. Я полагаю, мне нужен какой-то рекурсивный метод для перемещения по структуре папок до тех пор, пока он не ударит по имени файла.
ИЗМЕНИТЬ: mkdir_p похоже, именно то, что мне нужно.
Однако, когда я использую путь "/a/b/c", я заметил, что FileUtils.mkdir_p (File.dirname(localdir))
возвращает ошибку: Errno:: EACCES: Permission denied -/a
Если я удаляю "/" спереди вручную, он работает. Чем это вызвано? Какое наилучшее решение для устранения ошибки? следует ли использовать только следующее?
path="/a/b/c"
if path[0]="/"
path=path[1..-1]
end
Однако, я чувствую, что это просто хак.
Ответы
Ответ 1
Вы не можете сохранить несуществующий путь. Как разработчик вы несете ответственность за то, чтобы убедиться, что пути назначения существуют до попытки сохранить файл.
Ruby имеет методы, позволяющие проверить наличие файла или каталога:
FileUtils.makedirs()
является псевдонимом mkpath
и mkdir_p
. Я предпочитаю makedirs
, потому что он мнемонический.
Они также будут полезны:
Между этими двумя я предпочитаю Dir.chdir
, потому что он принимает блок. Любые действия, которые происходят внутри этого блока, происходят в каталоге, в который вы изменили. При выходе каталог возвращается к тому, что было ранее.
Ответ 2
В модуле fileutils вы можете использовать mkdir_p
, который похож на команду mkdir -p
, которая создает полный путь, если он не" t уже существуют.
Ответ 3
Аналог * nix mkdir -p, mkdir_p - это то, что вам нужно, которое было предоставлено в двух других ответах, но я не видел, чтобы кто-либо обращался к вашим изменениям о разрешениях.
Решение - пользователь, вызывающий ваш script, требует права на запись в корневом каталоге.
Путь, "/a/b/c", обращается к корневому пути ( "/" ). Обычно это только запись, доступная пользователю root или пользователю, имеющему доступ к sudo.
Когда вы изменили путь к удалению ведущего "/", вы сказали mkdir_p создать каталоги "a/b/c" относительно текущего рабочего каталога вместо относительного корневого каталога. Причина, по которой модифицированная версия работает, заключается в том, что пользователь, вызывающий ваш ruby script, имеет разрешение на запись в текущем рабочем каталоге.
В качестве личного в стороне, если потребители вашего script предоставляют входной путь, то вы, вероятно, не хотите удалять ведущие косые черты, поскольку они могут создавать файлы/каталоги в совершенно другом месте, откуда пользователь ожидает... если это не является целью вашей программы, но сделать это ясно.
Литература: