2011-09-12 2 views

ответ

15

В соответствии с документами на языке Ruby, Dir.entries() не гарантирует какой-либо конкретный порядок перечисленных файлов, поэтому, если вам требуется какой-то заказ, лучше всего сделать это явно.

Например, если вам нужно сортировать по времени модификации файла (от старого к новому), вы можете сделать следующее:

Dir.entries('.').sort_by { |x| File.mtime(x) } 
+5

Или '.sort_by {| a | File.stat (a) .mtime} ', чтобы пропустить несколько вызовов' stat'. –

+2

Или '.sort_by {| a | File.mtime (a)} ', чтобы пропустить несколько« File :: Stat ». – cremno

8

Я думаю, что сортировка по умолчанию не выбрана, но вы можете использовать Dir.entries('some_path_to_dir').sort, чтобы отсортировать их по ASC-способу.

+0

Привет .. спасибо. Причина моего запроса заключается в том, что в моем рабочем месте уже есть код (в системе на моем рабочем месте), который предполагает, что Dir.entries() вернет данные в определенном порядке (по возрастанию-последнему-измененному дате). Таким образом, я не был уверен, что я должен придерживаться этого или изменить его, чтобы быть уверенным в заказе. –

0

Развивая ответ @maerics', ниже игнорирует . && .., регулярное выражение на основе фильтра , и при необходимости выберите последний файл.

Dir.chdir(in_dir) 
    target_file = Dir.entries(in_dir).select(|x| 
        x != '.' && 
        x != '..' && 
        x =~ /\somefile.txt\z/).sort_by{|f|File.mtime(f)}.last(1) 
    puts "here i am #{target_file}" 
0

Для других, кто может прийти сюда с тем же сомнением. Способ выбрать только те файлы, которые соответствуют регулярному выражению и по-прежнему иметь возможность сортировать их так, как вы хотите это:

files_sorted_by_date = Dir["your regex"].sort_by { |x| File.birthtime(x) }.reverse

или

files_sorted_by_date = Dir["your regex"].sort_by { |x| File.birthtime(x) }

В зависимости от того, как вы хотите, чтобы ваши файлы сортируются.

Я не мог сделать то же самое с использованием метода Dir.entries

Смежные вопросы