Подтвердить что ты не робот

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

Однако, я чувствую, что это просто хак.

4b9b3361

Ответ 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 предоставляют входной путь, то вы, вероятно, не хотите удалять ведущие косые черты, поскольку они могут создавать файлы/каталоги в совершенно другом месте, откуда пользователь ожидает... если это не является целью вашей программы, но сделать это ясно.

Литература: