附加库

fcntl.so

--> Fcntl
Fcntl

该模块囊括了可用在Unix的系统调用fcntl(2) (也就是IO#fcntl)中的常数。这些常数包括
常数:

F_DUPFD
F_GETFD
F_GETLK
F_SETFD
F_GETFL
F_SETFL
F_SETLK
F_SETLKW
FD_CLOEXEC
F_RDLCK
F_UNLCK
F_WRLCK
O_CREAT
O_EXCL
O_NOCTTY
O_TRUNC
O_APPEND
O_NONBLOCK
O_NDELAY
O_RDONLY
O_RDWR
O_WRONLY
O_ACCMODE ((<ruby 1.8 特性>)) version 1.8.1 以后
fileutils.rb

ruby 1.7 特性
module 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, verbose

removes 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 verbose

same 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'

module FileUtils::Verbose

与FileUtils中的方法定义相同, 且运作方式也一样, 但在运行前会出现提示信息。
module FileUtils::NoWrite

与FileUtils中的方法定义相同, 但实际上并不会对文件做出修改。
final.rb

该库中定义的方法已被纳入ruby本身, 因此该库已被停用(obsolete)。
finalize.rb

--> Finalizer
Finalizer
find.rb

--> Find
Find

用来搜索目录下的文件的模块。
用法:

require "find"

Find.find('/foo','/bar') {|f| ...}

或者

require "find"

include Find
find('/foo','/bar') {|f| ...}

下面我们就用该模块来改写ruby文档中包含的范例脚本[ruby-src:sample/trojan.rb]。

#! /usr/bin/env ruby
require "find"
# 搜索允许其他人进行写操作的危险命令

for dir in ENV['PATH'].split(File::PATH_SEPARATOR)
 Find::find(dir) do |fpath|
  if File.file?(fpath) and (File.stat(fpath).mode & 022) != 0
  printf("file %s is writable from other users\n", fpath)
  end
 end
end

模块函数:

Find.find(dir[, ...]) {|file| }

  就象find(1)一样,它将dir下的所有文件和目录依此传给参数file,进行块的计算。传给file时的次序是不确定的。

  若您想跳过某目录下的搜索时,可以像

  require 'find'

  Find.find('/tmp') {|f|
  Find.prune if f == "/tmp/bar"
  ...
  }

  这样来使用Find.prune。在此例中,它不会搜索"/tmp/bar"下的文件和目录。若使用next来替代prune的话, 将跳过"/tmp/bar",然后继续进行下面的搜索.
Find.prune

  若将目录传给Find.find方法的块时就会执行该方法, 它会在搜索过程中忽略该目录。

更新履历:

version 1.4 (ruby version 1.6.1)

  不再搜索目录的符号连接。
forwardable.rb

为类定义方法委托功能。定义了下列模块.

  * Forwardable
  * SingleForwardable

详情请参考[ruby-src:doc/forwardable.rd.ja]
Forwardable

详情请参考[ruby-src:doc/forwardable.rd.ja]