Ruby 文件

Posted on April 2, 2014

Dir

类方法

  • pwd 返回当前进程的工作目录(cd到A目录,去执行B目录的脚本,pwd返回A目录)

  • chdir( [ string] ) chdir( [ string] ) {| path | block }

    改变当前进程的工作目录,如果传了block,那么在block里改变当前目录,block结束后恢复原来的当前目录

    如果没有传递参数,将进入环境变量HOME的目录

  • glob( pattern, [flags] ) → array

    glob( pattern, [flags] ) {| filename | block } → nil

    通过 expanding pattern(不是正则表达式)查找文件名,pattern 是一个字符串或者字符串数组

  • 加载当前目录所有rb文件: Dir["/path/to/directory/*.rb"].each {|file| require file }


File

  • __FILE__ 当前文件的绝对路径文件名字符串

  • 获取当前执行脚本的所在目录 File.expand_path('..', __FILE__)

类方法

  • exists?(filename) exist?(filename) 文件或目录是否存在,返回true 或者false,相对于当前工作目录(Dir.pwd)

  • dirname(file_name ) → dir_name 返回file_name的目录名(绝对路径)

  • directory?(path) path 是字符串,该方法会验证path是否是存在的目录

  • extname(path) → string 返回文件路径的扩展名

      File.extname("a/b/d/test.rb")   #=> ".rb"
      File.extname("test")            #=> ""
      File.extname(".profile")        #=> ""
    

Pathname

  • 需要手动加载 require 'pathname'

  • 不代表文件本身,代表文件/目录路径,可以是相对或者绝对

  • 除非你试图引用一个文件,否则Pathname不关心存在与否

  • 不可变,没有方法修改自身

核心方法:

以下方法只是操作字符串:

  • +
  • join
  • parent
  • root? 是否是根目录
  • absolute?
  • relative?
  • relative_path_from

      main_path = Pathname.new('/home/zhonghua/code/work/txx800_fire') #<Pathname:/home/zhonghua/code/work/txx800_fire>
      ued_pro_path = Pathname.new('/home/zhonghua/code/work/zxx800_pro') #<Pathname:/home/zhonghua/code/work/zxx800_pro>
      ued_pro_path.relative_path_from(main_path) #<Pathname:../zxx800_pro>
    
  • each_filename
  • cleanpath

以下方法要触及文件系统:

  • realpath
  • realdirpath
  • children
  • each_child
  • mountpoint?

参考资料