Простой способ определить, является ли строка файлом или каталогом - PullRequest
3 голосов
/ 16 марта 2011

Я пытаюсь написать небольшой скрипт ruby, который определяет, является ли данный аргумент файлом или каталогом, на основе строки, содержащей конечный / или нет.

Для ясности я 'm не интересно знать, существует ли файл или каталог на самом деле , другими словами AFAIK File.directory? не будет работать для меня.

Также все найденные мной методыв стандартной библиотеке, например Pathname.basename, автоматически удаляется завершающий / (если есть).Так что сделать что-то вроде этого:

arg = "/foo/bar/baz/"
if File.basename(arg).include?("/")
    puts "#{arg} is a directory"
end

не будет работать.

Есть ли краткий способ сделать это?Я что-то упустил?

Я бы не стал прибегать к регулярным выражениям, если это вообще возможно.

Ответы [ 3 ]

8 голосов
/ 16 марта 2011

Это зависит только от последнего символа? Если да, то arg[-1] достаточно

if arg[-1] == ?/
    puts "#{arg} is a directory"
end
2 голосов
/ 16 марта 2011

Поскольку /foo/bar/baz может ссылаться на или файл с именем baz в каталоге /foo/bar или каталог с именем /foo/bar/baz, невозможно точно определить, является ли он каталогом или файл без фактического попадания в файловую систему.

Правила для имен файлов не делают различий между файлами и каталогами - на самом деле во многих разновидностях * nix каталог является файлом только со специальными атрибутами. Если вы хотите установить правило для вашего приложения, которое гласит, что каталоги всегда заканчиваются конечным разделителем, вы можете использовать:

is_directory = arg =~ %r{#{File.PATH_SEPARATOR}\Z}

или

is_directory = arg[=1] == File.PATH_SEPARATOR
0 голосов
/ 16 марта 2011

Ты имеешь в виду что-то подобное?

puts "#{arg} is a directory" if arg =~ %r|/\z|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...