Tôi mới dùng Ruby (là một nhà phát triển Java) và cố gắng triển khai phương thức (oh, xin lỗi, một hàm) sẽ truy xuất và sinh ra tất cả các tệp trong thư mục con một cách đệ quy.danh sách tệp đệ quy trong Ruby
Tôi đã thực hiện nó như:
def file_list_recurse(dir)
Dir.foreach(dir) do |f|
next if f == '.' or f == '..'
f = dir + '/' + f
if File.directory? f
file_list_recurse(File.absolute_path f) { |x| yield x }
else
file = File.new(f)
yield file
end
end
end
Câu hỏi của tôi là:
- Liệu File.new thực sự mở một tập tin? Trong Java mới File ("xxx") không ... Nếu tôi cần phải mang lại một số cấu trúc mà tôi có thể truy vấn thông tin tập tin (ctime, kích thước vv) từ những gì nó sẽ được trong Ruby?
- {| x | năng suất x} trông hơi kỳ lạ đối với tôi, là OK để làm sản lượng từ các chức năng đệ quy như vậy, hoặc là có một số cách để tránh nó?
- Có cách nào để tránh kiểm tra '.' và '..' trên mỗi lần lặp?
- Có cách nào tốt hơn để thực hiện việc này không?
Cảm ơn
PS: việc sử dụng mẫu của phương pháp của tôi là một cái gì đó như thế này:
curr_file = nil
file_list_recurse('.') do |file|
curr_file = file if curr_file == nil or curr_file.ctime > file.ctime
end
puts curr_file.to_path + ' ' + curr_file.ctime.to_s
(mà sẽ giúp bạn có được các tập tin lâu đời nhất từ cây)
= =========
Vì vậy, nhờ @buruza emon Tôi đã tìm ra hàm Dir.glob tuyệt vời đã lưu cho tôi một vài dòng mã. Ngoài ra, nhờ vào @Casper tôi phát hiện ra phương pháp File.stat, khiến chức năng của tôi chạy nhanh hơn với File.new
hai lần Cuối cùng mã của tôi đang tìm kiếm một cái gì đó như thế này:
i=0
curr_file = nil
Dir.glob('**/*', File::FNM_DOTMATCH) do |f|
file = File.stat(f)
next unless file.file?
i += 1
curr_file = [f, file] if curr_file == nil or curr_file[1].ctime > file.ctime
end
puts curr_file[0] + ' ' + curr_file[1].ctime.to_s
puts "total files #{i}"
=====
Theo mặc định Dir.glob bỏ qua tên tập tin bắt đầu với dấu chấm (coi là 'ẩn' trong * nix), vì vậy nó rất quan trọng để thêm file số thứ hai :: FNM_DOTMATCH
Đó là tuyệt vời!Nhưng nó tạo ra một mảng các đối tượng String. Những gì tôi đang tìm kiếm là hàm sẽ tạo ra một cấu trúc giống như File để tôi có thể tự tính toán dựa trên đó. Tìm tập tin lớn nhất, ctime sớm nhất vv –
Dir ['.'] Không chấp nhận một khối. Nhưng Dir.glob thì có! Nó trả lời các câu hỏi của tôi, ngoại trừ câu hỏi # 1 –