web-dev-qa-db-ja.com

ルビーで最終変更時刻までにファイルを注文するにはどうすればよいですか?

ルビーで最後に変更された時間順にファイルを取得するにはどうすればよいですか?私はこれを達成するのに十分なほどキーボードを壊すことができました:

file_info = Hash[*Dir.glob("*").collect {|file| [file, File.ctime(file)]}.flatten]
sorted_file_info = file_info.sort_by { |k,v| v}
sorted_files = sorted_file_info.collect { |file, created_at| file }

しかし、これを行うためのより洗練された方法があるのだろうか?

29
Joni

簡単に言うと:

# If you want 'modified time', oldest first
files_sorted_by_time = Dir['*'].sort_by{ |f| File.mtime(f) }

# If you want 'directory change time' (creation time for Windows)
files_sorted_by_time = Dir['*'].sort_by{ |f| File.ctime(f) }
58
Phrogz

これに関する実際の問題は、* nixベースのファイルシステムがファイルの作成時間を保持せず、変更時間のみを保持することです。

Windowsはそれを追跡しますが、基盤となるファイルシステムに助けを求めようとすると、そのOSに制限されます。

また、 ctime は「作成時間」を意味するのではなく、ファイルを指すディレクトリ情報の変更時間である「変更時間」です。

ファイルの変更時刻が必要な場合は、 mtime です。これは、fileの変更時刻です。それは微妙ですが重要な違いです。

10
the Tin Man

Dir.glob("*").sort {|a,b| File.ctime(a) <=> File.ctime(b) }

4
scragz