Ruby - 文件I/O.

Ruby提供了一整套与内核模块相关的I/O相关方法.所有I/O方法都是从类IO派生的.

IO 提供了所有基本方法,例如读,写,获取,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


获取语句

获取语句可用于从标准屏幕STDIN中获取用户的任何输入.

示例

以下代码显示如何使用获取声明.此代码将提示用户输入一个值,该值将存储在变量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 语句类似于 put 声明.唯一的区别是 puts 语句在打印内容后转到下一行,而使用 print 语句时,光标位于同一行.

实施例

#!/usr/bin/ruby

print "Hello World"
print "Good Morning"


这将产生以下结果 :

Hello WorldGood Morning


打开和关闭文件

到目前为止,你一直在阅读和写入标准输入和输出.现在,我们将看到如何使用实际数据文件.

File.new方法

您可以创建文件根据模式字符串使用 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


Sr.No.模式&说明
1

r

只读模式.文件指针位于文件的开头.这是默认模式.

2

r +

读写模式.文件指针位于文件的开头.

3

w

只写模式.如果文件存在,则覆盖文件.如果文件不存在,则创建一个新文件进行写入.

4

w +

读写模式.如果文件存在,则覆盖现有文件.如果文件不存在,则创建一个新文件进行读写.

5

a

只写模式.如果文件存在,则文件指针位于文件的末尾.也就是说,文件处于追加模式.如果该文件不存在,则会创建一个新文件进行写入.

6

a +

读写模式.如果文件存在,则文件指针位于文件的末尾.该文件以追加模式打开.如果文件不存在,它会创建一个新文件进行读写.

读取和写入文件

我们用于"简单"I/O的方法与所有文件对象相同.因此,从标准输入读取一行, aFile.gets 从文件对象aFile读取一行.

但是,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方法

此方法属于类文件.方法 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方法

文件是类的子类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]将包含第一行,而arr [1]将包含文件的第二行.

IO.foreach方法

此方法也逐行返回输出.方法 foreach 和方法 readlines 之间的区别在于方法 foreach 与块相关联.但是,与方法 readlines 不同,方法 foreach 不返回数组.例如 :

#!/usr/bin/ruby

IO.foreach("input.txt"){|block| puts block}


这段代码会将文件 test 的内容逐行传递给变量块,然后输出将显示在屏幕上.

重命名和删除文件

您可以使用带有重命名的Ruby以编程方式重命名和删除文件删除方法.

以下是重命名现有文件的示例 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("test2.txt")


文件模式和所有权

使用 chmod 带掩码的方法来更改文件的模式或权限/访问列表 :

以下是将现有文件 test.txt 的模式更改为掩码值 :

#!/usr/bin/ruby

file = File.new( "test.txt", "w" )
file.chmod( 0755 )


Sr.No.Mask&说明
1

0700

所有者的rwx面具

2

0400

r for owner

3

0200

w for owner

4

0100

x for owner

5

0070

小组的rwx面具

6

0040

r for group

7

0020

w为小组

8

0010

x for group

9

0007

其他的rwx掩码

10

0004

r for其他

11

0002

w for other

12

0001

x for other

13

4000

执行时设置用户ID

14

2000

执行时设置组ID

15

1000

保存交换文本,即使在使用后

文件查询

以下命令在打开文件之前测试文件是否存在&减去;

#!/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和处理这些也没有问题.而 File 类处理文件时,目录使用 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 =读取,w =写入,x =执行。

Dir.mkdir( "mynewdir", 755 )

删除目录

Dir.delete可用于删除目录。 Dir.unlink和Dir.rmdir执行完全相同的功能,为方便起见而提供。

Dir.delete("testdir")

创建文件和临时目录

临时文件是在程序执行期间可能短暂创建但不是永久存储信息的文件。


Dir.tmpdir提供当前系统上临时目录的路径,但默认情况下该方法不可用。 要使Dir.tmpdir可用,必须使用require'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内置函数:

  • 文件类和方法。

  • 目录类和方法。