Получить список подпапок из заданной папки в JRuby

Я использую JRuby в SikuliX IDE, чтобы рекурсивно получить список папок и их подпапок и сохранить его абсолютные пути (которые могут также содержать символы с точками) в массиве. Я пробовал использовать следующий код:

records = Dir.glob 'C:/_private/Files/**/*/'

Я получил сообщение об ошибке:

[error] SyntaxError ( invalid multibyte char (UTF-8) )

Ожидаемый результат:

C:/_private/Files/dir1
C:/_private/Files/dir1/subdir1
C:/_private/Files/dir1/subdir2
C:/_private/Files/dir2
C:/_private/Files/dir2/subdir1
C:/_private/Files/dir2/subdir2

Посмотрите этот URL, может он вам поможет stackoverflow.com/questions/17859530/…. Также позволь мне

Kandy 07.01.2019 11:21

@Kandy: Проблема в абсолютном пути, но я не уверен, как мне ее избежать.

plaidshirt 07.01.2019 11:34

в какой операционной системе вы работаете

Kandy 07.01.2019 11:43

@Kandy: Я использую его в Windows.

plaidshirt 07.01.2019 12:11

не могли бы вы предоставить еще код, чтобы я посмотрел, что на самом деле происходит. Я установил рубин в свою систему

Kandy 07.01.2019 12:13

@ Канди: Я просто использую его в цикле: records.each do |item|

plaidshirt 07.01.2019 12:25

Не могли бы вы включить в свой пример имена каталогов, которые вы ожидаете получить? Это позволит любому, кто ответит на этот вопрос, воссоздать ваш пример и вашу ошибку.

anothermh 07.01.2019 22:00

@anothermh: я добавил ожидаемый результат.

plaidshirt 08.01.2019 09:08

Я думаю, вы ищете только папки, поэтому я опубликовал ответ ниже, проверьте

ray 08.01.2019 09:33
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
2
9
263
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

пожалуйста, проверьте новые вещи, которые дают ожидаемый результат -

 records = Dir.glob('/E:/ISSUE_Folder/**/*.*')

 records.each do |item|
   puts File.dirname(item)
 end

Как вы видите, он идет в каждую папку и подпапку

Это не работает, если в пути есть символы с точками, и в первую очередь мне нужен только полный путь к подкаталогам.

plaidshirt 07.01.2019 12:55

Пунктирный означает, что вы можете отправить свой путь

Kandy 07.01.2019 12:57

Я не могу вас понять. Просто отредактируйте еще немного кода в своем вопросе, чтобы я мог воспроизвести вашу ошибку на своей стороне.

Kandy 07.01.2019 13:03

Я редактировал вопрос. Проблема с вашим выводом в том, что нужны только подпапки, файлы - нет, но он должен работать рекурсивно, чтобы получить все подпапки.

plaidshirt 07.01.2019 14:38

@plaidshirt Я отредактировал свой ответ и надеюсь, что он соответствует вашим требованиям.

Kandy 08.01.2019 07:39

Я добавил пример ожидаемого результата к вопросу. Мне нужны имена вложенных папок, а не имена файлов.

plaidshirt 08.01.2019 09:10

В моем приложении rails есть папка config и количество файлов и подпапок, поэтому получаются только папки в config,

Я использовал ap ниже предоставленный драгоценным камнем awesome_print

> ap Dir.glob "#{Rails.root}/config/**/"
[
    [0] "/home/ray/projects/example_app/config/",
    [1] "/home/ray/projects/example_app/config/initializers/",
    [2] "/home/ray/projects/example_app/config/locales/",
    [3] "/home/ray/projects/example_app/config/environments/"
]

У меня есть папка test внутри config/locales/, она также получается по следующему запросу.

> ap Dir.glob "#{Rails.root}/config/**/**/"
[
    [0] "/home/ray/projects/example_app/config/",
    [1] "/home/ray/projects/example_app/config/initializers/",
    [2] "/home/ray/projects/example_app/config/locales/",
    [3] "/home/ray/projects/example_app/config/locales/test/",
    [4] "/home/ray/projects/example_app/config/environments/"
]

Для дальнейшего поиска подпапок на третьем уровне иерархии я буду использовать "#{Rails.root}/config/**/**/**/".

Обновлять:

Вы можете попробовать следующее для окна,

irb(main):022:0> Dir.glob("D:/sd/*/")  # first hierarchy 
=> ["D:/sd/df/", "D:/sd/dff/"]   

irb(main):023:0> Dir.glob("D:/sd/*")
=> ["D:/sd/351px-Nvidia_logo.png", "D:/sd/df", "D:/sd/dff"]

irb(main):024:0> Dir.glob("D:/sd/*/*/") # second hierarchy
=> ["D:/sd/dff/ty/"]

irb(main):025:0> Dir.glob("D:/sd/*/*")
=> ["D:/sd/df/351px-Nvidia_logo2.png", "D:/sd/dff/ty"]

Вы можете дополнительно получить результат, добавив подпапки первой и второй иерархии (прокомментировано выше).

Спасибо, но как я могу использовать абсолютный путь в Windows? Обозначение C: / кажется недействительным.

plaidshirt 08.01.2019 10:10

@plaidshirt Проверил в windows, проверьте, работает ли.

ray 08.01.2019 11:03

Возможно, ваш JRuby использует меньше или равно Ruby 1.9

В Ruby 1.9 заголовок вашего файла должен указывать формат кодировки.

Добавьте эту строку вверху

# encoding: UTF-8

Другие вопросы по теме