【Ruby】【目录 & 引用 & 文件 】
【【目录】】
当前文件在根目录下一个文件夹下
引用当前文件所在目录上一级目录下某.rb文件
方法一
require File.join(File.dirname(FILE),'..','test_one')
方法二
require File.join(FILE,'..','..','test_one')
cal = Calculator1.new
cal.abc
引用当前文件所在目录上一级目录下(在这里就是根目录下)所有.rb文件
Dir[FILE + '/../../*.rb'].each {|file| p file }
可以打印出对应目录下所有.rb文件
Dir[FILE + '/../../*.rb'].each {|file| require file }
但是require后就还是引用不到对应文件下的类,原因不明
参考:https://www.cnblogs.com/timsheng/archive/2013/04/08/3007059.html
1、引用一个文件
例: 引用当前rb同目录下的file_to_require.rb
先介绍3种方法
require File.join(_FILE, '../file_to_require')。
require File.expand_path('../file_to_require', FILE)
require File.dirname(FILE) + '/file_to_require'
其中,File.expand_path是Rails常用的做法。
__FILE__为常量,表示当前文件的绝对路径,如/home/oldsong/test.rb
法四:
$LOAD_PATH.unshift(File.dirname(FILE))
require 'bar'
先把目录加入LOAD_PATH变量中,然后可直接引用文件名。
2、引用一个目录下所有文件
Ruby没有Java中的import java.io.*;
引用时不能用通配符,估计以后的版本有可能加上。
例:引用当前rb相同目录下lib/文件下所有*.rb文件。
法一:
Dir[File.dirname(FILE) + '/lib/*.rb'].each {|file| require file }
法二:
一个gem搞定
https://rubygems.org/gems/require_all
【文件】
知识点: FileUtils 基本文件操作
FileUtils.cd( dir, *options )
FileUtils.cd( dir, *options ) {|dir| .... }
Options: noop verbose移动到dir目录。若被用作迭代器的话, 将在块停止工作之后返回原来的目录。 FileUtils.cd '/', :verbose # chdir and report it
FileUtils.uptodate?( newer, older_list, *options )
Options: verbose若newer比older_list中的任何文件都新的话,就返回真。不存在的文件会被看做是最老的文件。 FileUtils.newest? 'hello.o', 'hello.c', 'hello.h' or system 'make'
FileUtils.mkdir( dir, *options )
Options: noop verbose生成dir目录 。 FileUtils.mkdir 'test' FileUtils.mkdir %w( tmp data ) FileUtils.mkdir 'notexist', :noop # does not create really
FileUtils.mkdir_p( dir, *options )
Options: noop verbose将生成dir目录及其所有上级目录。例如 FileUtils.mkdir_p '/usr/local/lib/ruby'将生成下列所有目录(若没有的话)。 * /usr * /usr/local * /usr/local/bin * /usr/local/bin/ruby
FileUtils.rmdir( dir, *options )
Options: noop, verboseremoves directory DIR. FileUtils.rmdir 'somedir' FileUtils.rmdir %w(somedir anydir otherdir) # does not remove directory really, outputing message. FileUtils.rmdir 'somedir', :verbose, :noop
FileUtils.ln( old, new, *options )
Options: force noop verbose生成指向old的硬连接new 。若new已存在且为目录时,生成new/old 。若new已存在且不是目录的话,会引发Errno::ENOTDIR异常。但是若指定了force选项的话,就会覆盖new。 FileUtils.ln 'gcc', 'cc', :verbose FileUtils.ln '/usr/bin/emacs21', '/usr/bin/emacs'
FileUtils.ln( list, destdir, *options )
Options: force noop verbose生成指向list[0]的硬连接destdir/list[0]和指向list[1]的硬连接destdir/list[1]...。若destdir不是目录的话, 将引发Errno::ENOTDIR异常。 include FileUtils cd '/bin' ln %w(cp mv mkdir), '/usr/bin'
FileUtils.ln_s( old, new, *options )
Options: force noop verbose生成指向old的符号连接new 。若new已存在且为目录时,生成new/old 。若new已存在且不是目录的话,会引发Errno::ENOTDIR异常。但是若指定了force选项的话,就会覆盖new。 FileUtils.ln_s '/usr/bin/ruby', '/usr/local/bin/ruby' FileUtils.ln_s 'verylongsourcefilename.c', 'c', :force
FileUtils.ln_s( list, destdir, *options )
Options: force noop verbose生成指向list[0]、list[1]...的符号连接 dir/list[0], dir/list[1]...。若destdir不是目录的话,将引发 Errno::ENOTDIR异常。生成指向list[0]的符号连接 destdir/list[0]和指向list[1]的符号连接destdir/list[1]...。若destdir不是目录时,将引发Errno::ENOTDIR异常。 FileUtils.ln_s Dir.glob('bin/*.rb'), '/home/aamine/bin'
FileUtils.ln_sf( src, dest, *options )
Options: noop verbose与ln_s(src,dest,:force)相同。
FileUtils.cp( src, dest, *options )
Options: preserve noop verbose将文件src拷贝到dest。若dest是目录的话,就拷贝到dest/src。若dest早已存在且并非目录时将进行覆盖。 FileUtils.cp 'eval.c', 'eval.c.org'
FileUtils.cp( list, dir, *options )
Options: preserve noop verbose把file1拷贝到dir/file1,把file2拷贝到dir/file2,就这样将file1、file2以相同的文件名拷贝到dir目录。若dir并非目录时, 会引发Errno::ENOTDIR异常。 FileUtils.cp 'cgi.rb', 'complex.rb', 'date.rb', '/usr/lib/ruby/1.6' FileUtils.cp :verbose, %w(cgi.rb complex.rb date.rb), '/usr/lib/ruby/1.6'
FileUtils.cp_r( src, dest, *options )
Options: preserve noop verbose将src拷贝到dest。若src是目录则进行递归式的拷贝。此时若dest是目录,则拷贝到dest/src。 # installing ruby library "mylib" under the site_ruby FileUtils.rm_r site_ruby + '/mylib', :force FileUtils.cp_r 'lib/', site_ruby + '/mylib'
FileUtils.cp_r( list, dir, *options )
Options: preserve noop verbose将list[0]、list[1], list[2]...等拷贝到dir目录中.若list[n]是目录的话,就进行递归式的拷贝。 FileUtils.cp_r %w(mail.rb field.rb debug/) site_ruby + '/tmail' FileUtils.cp_r Dir.glob('*.rb'), '/home/aamine/lib/ruby', :noop, :verbose
FileUtils.mv( src, dest, *options )
Options: noop verbose将from移动直to。若to是目录,就移动到to/from。若给出了3个以上的参数时, 将把其他文件移动到dir目录中。 FileUtils.mv 'badname.rb', 'goodname.rb' FileUtils.mv 'stuff.rb', 'lib/ruby', :force
FileUtils.mv( list, dir, *options )
Options: noop verbose将file1 file2...移动到dir/file1 dir/file2...若进行跨区移动时,则进行拷贝。 FileUtils.mv 'junk.txt', 'dust.txt', '/home/aamine/.trash/' FileUtils.mv Dir.glob('test*.rb'), 'T', :noop, :verbose
FileUtils.rm( list, *options )
Options: force noop verbose删除list[0]、list[1]...。若指定了:force 选项的话,则会忽略操作过程中所有的StandardError。 FileUtils.rm %w( junk.txt dust.txt ) FileUtils.rm Dir['*.so'] FileUtils.rm 'NotExistFile', :force # never raises exception
FileUtils.rm_r( list, *options )
Options: force noop verbose删除list[0], list[1]...文件或目录.若使用了force选项时,将忽略StandardError。 FileUtils.rm_r Dir.glob('/tmp/*') FileUtils.rm_r '/', :force # 😃
FileUtils.rm_rf( list, *options )
Options: noop verbosesame to rm_r(list,:force)
FileUtils.cmp( file_a, file_b, *options )
Options: verbose若文件a和文件b的内容相同, 则返回真。 FileUtils.cmp 'somefile', 'somefile' #=> true FileUtils.cmp '/bin/cp', '/bin/mv' #=> maybe false.
FileUtils.install( src, dest, mode = <src's>, *options )
Options: noop verbose若from与to内容不同时,才会将from拷贝到to。此时会将模式设为mode。 FileUtils.install 'ruby', '/usr/local/bin/ruby', 0755, :verbose FileUtils.install 'lib.rb', '/usr/local/lib/ruby/site_ruby', :verbose
FileUtils.chmod( mode, list, *options )
Options: noop verbose将文件LIST[0]、LIST[1]...的permission变为mode. FileUtils.chmod 0644, 'my.rb', 'your.rb' FileUtils.chmod 0755, 'somecommand' FileUtils.chmod 0755, '/usr/bin/ruby', :verbose
FileUtils.touch( list, *options )
Options: noop verbose更新list[0], list[1]...的最终修改时间(mtime)和访问时间(atime).若list[n]并不存在时,就生成空文件。 FileUtils.touch 'timestamp' FileUtils.touch Dir.glob('*.c'); system 'make'
知识点:ruby--$:.unshift File.expand_path('..', FILE)
一直能看到一些gem里面会有这样一句代码:
$:.unshift File.expand_path('..', FILE)
这句话是干什么用的呢
$:就是ruby的一个全局变量,也叫$LOAD_PATH,功能就是java中的classpath,用来加载类库的,当你require某个文件时,ruby就会从这个变量的值去查找,找不到会报LoadError。这个值其实就是一个包含了类库绝对路径的数组。
FILE__这个变量代表文件自己的文件名,在foo.rb中puts__FILE,结果就是foo.rb。
File.expand_path可以把路径转换成绝对路径,假设有这样一个文件/Users/kenshin/foo.rb,里面有File.expand_path('..', FILE),返回的结果就是/Users/kenshin。
unshift是数组的一个方法,功能就是把指定的值加到数组的最前面,[3,4].unshift(1,2) => [1,2,3,4]
所以这段代码的意思就是把当前文件所在的目录加到ruby的loadpath的最前面,在require文件时,ruby就会先从当前目录下去查找了。
知识点:ruby File.basename函数 & File.dirname函数
File.basename函数
返回filename中的最后一条斜线后面的部分。若给出了参数suffix且它和filename的尾部一致时,该方法会将其删除并返回结果。
例:
p File.basename("ruby/ruby.c") #=> "ruby.c"
p File.basename("ruby/ruby.c", ".c") #=> "ruby"
p File.basename("ruby/ruby.c", ".*") #=> "ruby"
p File.basename("ruby/ruby.exe", ".*") #=> "ruby"
File.dirname函数
以字符串的形式返回filename中最后一条斜线之前的部分。若文件名中不含斜线,则返回"."(当前目录)。
例:
p File.dirname("dir/file.ext") # => "dir"
p File.dirname("file.ext") # => "."
另外,请参考File.basename, File.extname 。
ruby 1.8 特性
修改后,File.dirname的动作遵守SUSv3的规定。
p File.dirname("foo/bar/") # => "foo" 以前是、"foo/bar"
p File.dirname("foo//bar") # => "foo" 以前是、"foo/"