位置:首頁 > 腳本語言 > Ruby基礎教程 > Ruby文件I/O 目錄

Ruby文件I/O 目錄

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

這裡是一個不同的模式打開文件列表:

模式 描述
r Read-only mode. The file yiibaier is placed at the beginning of the file. This is the default mode.
r+ Read-write mode. The file yiibaier will be at the beginning of the file.
w Write-only mode. Overwrites the file if the file exists. If the file does not exist, creates a new file for writing.
w+ Read-write mode. Overwrites the existing file if the file exists. If the file does not exist, creates a new file for reading and writing.
a Write-only mode. The file yiibaier is at the end of the file if the file exists. That is, the file is in the append mode. If the file does not exist, it creates a new file for writing.
a+ Read and write mode. The file yiibaier is at the end of the file if the file exists. The file opens in the append mode. If the file does not exist, it creates a new file for reading and writing.

讀取和寫入文件:

同樣的方法,我們一直在使用“簡單”的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方法:

掩碼 描述
0700 rwx mask for owner
0400 r for owner
0200 w for owner
0100 x for owner
0070 rwx mask for group
0040 r for group
0020 w for group
0010 x for group
0007 rwx mask for other
0004 r for other
0002 w for other
0001 x for other
4000 Set user ID on execution
2000 Set group ID on execution
1000 Save swapped text, even after use

文件查詢:

下麵的命令測試一個文件是否存在,然後再打開它:

#!/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的支持功能,處理文件和目錄的完整列表: