Ruby中操作文件的方法介绍
ruby提供了一套完整的i/o相关的内核模块中实现方法。所有i/o方法来自io类。
类io提供了所有的基本方法,如 read, write, gets, puts, readline, getc 和 printf.
本章将涵盖所有可供在ruby中使用的基本i/o功能。如需使用更多的功能,请参考ruby的io类。
puts 语句:
在前面的章节中,你指定值的变量和然后使用声明 puts 输出。
puts 把语句指示程序显示存储在变量值。这将添加一个新行,每行末尾写出(输出)。
例子:
#!/usr/bin/ruby val1 = "this is variable one" val2 = "this is variable two" puts val1 puts val2
这将产生以下结果:
this is variable one this is variable two
gets 语句:
gets 语句可以用来从用户从标准屏幕采取输入调用 stdin.
例如:
下面的代码显示了如何使用 gets 语句。此代码将提示用户输入一个值,将被存储在一个变量val,最后将打印在 stdout.
#!/usr/bin/ruby puts "enter a value :" val = gets puts val
这将产生以下结果:
enter a value : this is entered value this is entered value
putc 语句:
与 puts 语句不相同,它在屏幕上输出整个字符串,而putc 语句可以用来一次输出一个字符。
实例:
下面的代码的输出只是一个字符 h:
#!/usr/bin/ruby str="hello ruby!" putc str
这将产生以下结果:
h
print 语句:
print 语句是类似 puts 语句。唯一的区别是,puts语句后进入到下一行打印的内容,print 语句将光标定位在同一行上。
实例:
#!/usr/bin/ruby print "hello world" print "good morning"
这将产生以下结果:
hello worldgood morning
打开和关闭文件:
到现在为止,我们已经可以读取和写入的标准输入和输出。我们将看看如何运用到实际的数据文件。
file.new 方法:
可以创建一个的file对象使用file.new方法的读,写或两者兼有,这需要根据模式串。最后,可以使用file.close的方法来关闭该文件。
语法:
afile = file.new("filename", "mode") # ... process the file afile.close
file.open 方法:
可以使用file.open方法的方法来创建一个新的文件对象,并分配到一个文件中,文件对象。然而,file.open方法和file.new方法之间区别。 file.open方法不同的是,可以关联一个块,而不能在file.new方法使用。
file.open("filename", "mode") do |afile| # ... process the file end
这里是一个不同的模式打开文件列表:
读取和写入文件:
同样的方法,我们一直在使用“简单”的i/o所有文件对象。因此,gets 从标准输入读取一行,file.gets文件从文件对象读取一行。
然而,i/o对象提供额外的访问方法,使我们的生活更轻松。
sysread 方法:
可以使用该方法sysread读取一个文件的内容。可以打开该文件时,在任何模式中使用的方法sysread。例如:
以下是输入文本文件:
this is a simple text file for testing purpose.
现在,让我们尝试读取这个文件:
#!/usr/bin/ruby afile = file.new("input.txt", "r") if afile content = afile.sysread(20) puts content else puts "unable to open file!" end
这条语句将输出文件的前20个字符。现在,将文件指针放置在第21个字符。
syswrite 方法:
可以使用方法 syswrite 中的内容写入到一个文件中。需要打开该文件在写入模式使用方法 syswrite 时。
例如:
#!/usr/bin/ruby afile = file.new("input.txt", "r+") if afile afile.syswrite("abcdef") else puts "unable to open file!" end
这条语句将 “abcdef” 写入到文件中。
each_byte 方法:
这种方法属于类 file 。总是关联一个块方法each_byte。考虑下面的代码示例::
#!/usr/bin/ruby afile = file.new("input.txt", "r+") if afile afile.syswrite("abcdef") afile.each_byte {|ch| putc ch; putc ?. } else puts "unable to open file!" end
一个接一个字符传递变量ch,然后在屏幕上显示如下:
s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e... . .
io.readlines 方法:
类file 是 io类的一个子类。类的io也有一些方法可用于对文件进行操作。
io类的方法之一是io.readlines。此方法返回的内容文件行。下面的代码显示使用方法io.readlines:
#!/usr/bin/ruby arr = io.readlines("input.txt") puts arr[0] puts arr[1]
在这段代码中,变量arr是一个数组。将文件 input.txt 的每一行,将数组arr中的元素。因此arr[0]将包含在第一行,而到达[1]将包含该文件的第二行。
io.foreach 方法:
此方法还返回一行一行的输出。foreach和 readlines 方法之间的差异是 foreach方法可以带有块相关联,foreach不会返回一个数组。例如:
#!/usr/bin/ruby io.foreach("input.txt"){|block| puts block}
此代码将传递该文件的内容,测试可变块的行,然后,输出将被显示在屏幕上。
重命名和删除文件:
可以重命名和删除文件用ruby以编程方式使用 rename 和 delete 方法。
下面的例子,重命名现有文件 test1.txt:
#!/usr/bin/ruby # rename a file from test1.txt to test2.txt file.rename( "test1.txt", "test2.txt" )
下面的例子删除现有文件 test2.txt:
#!/usr/bin/ruby # delete file test2.txt file.delete("text2.txt")
文件模式和所有权:
使用chmod掩码的方法来改变模式或权限/访问的文件列表:
下面的例子改变现有的文件test.txt模式掩码值:
#!/usr/bin/ruby file = file.new( "test.txt", "w" ) file.chmod( 0755 )
以下的表可以帮助选择不同的面具为chmod方法:
文件查询:
下面的命令测试一个文件是否存在,然后再打开它:
#!/usr/bin/ruby file.open("file.rb") if file::exists?( "file.rb" )
下面的命令查询文件是否是真是个文件:
#!/usr/bin/ruby # this returns either true or false file.file?( "text.txt" )
给定文件名是否为一个目录,下面的命令查找:
#!/usr/bin/ruby # a directory file::directory?( "/usr/local/bin" ) # => true # a file file::directory?( "file.rb" ) # => false
下面的命令查找该文件是否可读,可写或可执行文件:
#!/usr/bin/ruby file.readable?( "test.txt" ) # => true file.writable?( "test.txt" ) # => true file.executable?( "test.txt" ) # => false
下面的命令查找该文件是否有大小为零或不:
#!/usr/bin/ruby file.zero?( "test.txt" ) # => true
下面的命令返回的文件大小:
#!/usr/bin/ruby file.size?( "text.txt" ) # => 1002
可以使用下面的命令找出一种类型的文件:
#!/usr/bin/ruby file::ftype( "test.txt" ) # => file
ftype 方法识别的文件类型返回下列之一: file, directory, characterspecial, blockspecial, fifo, link, socket 或 unknown.
下面的命令可以用来发现当一个文件被创建,修改或上次访问:
#!/usr/bin/ruby file::ctime( "test.txt" ) # => fri may 09 10:06:37 -0700 2008 file::mtime( "text.txt" ) # => fri may 09 10:44:44 -0700 2008 file::atime( "text.txt" ) # => fri may 09 10:45:01 -0700 2008
ruby中的目录:
所有文件都包含在不同的目录,ruby也没有处理这些问题。鉴于文件中类处理文件,使用目录处理dir类。
通过目录导航:
要改变一个ruby程序的目录内,可使用dir.chdir如下。这个例子改变当前目录 /usr/bin.
dir.chdir("/usr/bin")
可以使用 dir.pwd 找出当前目录是什么:
puts dir.pwd # this will return something like /usr/bin
得到一个使用一个特定的目录内的文件和目录列表,使用 dir.entries:
puts dir.entries("/usr/bin").join(' ')
dir.entries 返回一个数组的指定目录内的所有项目。dir.foreach 提供了相同的功能:
dir.foreach("/usr/bin") do |entry| puts entry end
更简捷的方法获取目录列表利用 dir 类数组的方法:
dir["/usr/bin/*"]
创建一个目录:
可以用 dir.mkdir,来创建目录:
dir.mkdir("mynewdir")
还可以设置一个新的目录权限(不是一个已经存在的)用mkdir:
注: 掩码755设置权限所有者,组表示 [所有人] 类似于 rwxr-xr-x , r = read, w = write, and x = execute.
dir.mkdir( "mynewdir", 755 )
删除目录:
可用 dir.delete 删除一个目录。dir.unlink 和 dir.rmdir 执行完全相同的功能,并提供了方便。
dir.delete("testdir")
创建文件和临时目录:
临时文件是程序的执行过程中可能会产生短暂的,但不是永久存储的信息。
dir.tmpdir 提供对当前系统的临时目录的路径,尽管该方法是默认不可用。为了使 dir.tmpdir 必要使用需要 'tmpdir'.
可以使用 dir.tmpdir 及 file.join,创建一个独立于平台的临时文件:
require 'tmpdir' tempfilename = file.join(dir.tmpdir, "tingtong") tempfile = file.new(tempfilename, "w") tempfile.puts "this is a temporary file" tempfile.close file.delete(tempfilename)
此代码创建一个临时文件,写入数据,并删除它。 ruby的标准库还包括一个程式库tempfile ,它可以创建临时文件:
require 'tempfile' f = tempfile.new('tingtong') f.puts "hello" puts f.path f.close
内置功能:
这里是ruby的支持功能,处理文件和目录的完整列表:
- file class and methods.
- dir class and methods.
上一篇: Ruby中数组的一些相关使用方法
下一篇: 进一步深入Ruby中的类与对象概念