ruby遍历文件夹所有文件

作者:周星 发布:2017-10-07

       之前写了一个程序,在配置文件中手动一个个的 require 了所有文件,当时因为种种原因忘了优化,今天优化了一下,并将方法扩展一下,现在我们重新开始,一起优化这个程序。

原程序:

# config/initialize.rb
# encoding: utf-8
# This file is userd for manage files we need
require 'bundler'
Bundler.require(:default)

require './app/hotel'
require './app/customer'
require './app/compute'
require './app/date_type.rb'
require './app/cost.rb'
require './lib/checker.rb'
require './lib/input_error.rb'

       这个程序在开始时还勉强看得过去,当我们需要 require 一个新的文件时,只要手动加进去就好了,但是随着程序慢慢扩大,需要 require 的文件会越来越多,这个 initialize.rb 文件也随着越来越大,不方便查找和管理,ruby 关于文件和文件夹提供了很多操作方法,让我们一步步来优化这个程序。

       首先,我们需要定义一个方法,参数为指定的 path,递归获取 path 路径下的所有文件,并把它们 require 进来,技术方案有了,下面我们开始 initialize.rb 1.0 版本:

def traverse(path)
  if File.directory?(path)             # 如果文件是一个文件夹
    dir = Dir.open(path)
    while name = dir.read
      next if name == "."              # 忽略当前目录
      next if name == ".."             # 忽略上级目录
      traverse(path + "/" + name)      # 递归调用
    else
      require 'path'
    end
  end
end
tarverse File.join("./", app/)

       与 File 类一样,Dir 类也有 read 方法,执行 Dir#read 后,程序会遍历读取最先打开的目录下的内容。分别为 .、..、其它目录名、文件名,所以我们在 traverse 方法里判断,如果 path 路径下还有文件夹,则递归调用 traverse 方法,否则就 require 它。

       Dir 类有一个 glob 方法,它可以让我们像 shell 一样使用 * 或者 ? 等通配符来获取文件名,此方法会将得到的结果以数组的形式返回,于是,initialize.rb 2.0 版本诞生了:

def require_all(path)
  Dir.glob("#{path}/*") do |f_path|
    if File.directory? f_path
      require_all f_path
    else
      require f_path 
    end     
  end
end

require_all File.join('./', 'app')
require_all File.join('./', 'lib')

       这样代码逻辑看起来更加的清晰了,事实上,我们还可以进一步优化它,上面我们说到 glob 方法可以让我们使用通配符,那我们直接传入通配符,让程序获取 path 目录及其子目录下的所有 .rb 文件。initialize.rb 终极版本:

def require_all(path)
  Dir.glob("#{path}/**/*.rb").each do |f_path|
    require f_path
  end
end

require_all File.join('./', 'app')
require_all File.join('./', 'lib')

注意一下 glob 方法里面的参数,它会获取 path 目录及子目录里所有后缀为 .rb 的文件

扩展:

       优化前的程序里,require 有的指定了 .rb 后缀,有的没有指定,这两种的区别在于,不加后缀的 require 会查找包括其它后缀的文件,比如 require 'compute', 它还会寻找 compute.dll,而指定了 .rb 后缀只会查找 ruby 文件。

       ruby 提供了大量的文件、文件夹处理的方法,它们几乎可以囊括你所有的需求,为了提高 code 的效率,你还有必要知道如下的几个库:

find

tempfile

fileutils

当你有这方面的需求时,首先应该考虑到它们,并查找它们的文档。

如果您对本文有什么意见或建议,请联系博主。

支付宝扫码赞助博主


评论(1)

Qq2

没名字第1楼

哇哇,访问量好高

2015-12-03 05:19:08