Ruby - 檔案 I/O



Ruby 提供了一整套在 Kernel 模組中實現的與 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 語句不同,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.new 方法建立 File 物件來進行讀取、寫入或同時進行讀取和寫入,具體取決於模式字串。最後,您可以使用 File.close 方法關閉該檔案。

語法

aFile = File.new("filename", "mode")
   # ... process the file
aFile.close

File.open 方法

您可以使用 File.open 方法建立一個新的檔案物件並將該檔案物件賦值給一個檔案。但是,File.openFile.new 方法之間存在一個區別。區別在於 File.open 方法可以與程式碼塊關聯,而使用 File.new 方法則無法做到這一點。

File.open("filename", "mode") do |aFile|
   # ... process the file
end

讀取和寫入檔案

我們一直在使用的“簡單”I/O 方法也適用於所有檔案物件。因此,gets 從標準輸入讀取一行,而 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 方法

此方法屬於 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] 將包含第一行,而 arr[1] 將包含檔案的第二行。

IO.foreach 方法

此方法也逐行返回輸出。foreach 方法和 readlines 方法的區別在於 foreach 方法與程式碼塊關聯。但是,與 readlines 方法不同,foreach 方法不返回陣列。例如:

#!/usr/bin/ruby

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

此程式碼將 test 檔案的內容逐行傳遞給變數 block,然後輸出將顯示在螢幕上。

重新命名和刪除檔案

您可以使用 Ruby 中的 renamedelete 方法以程式設計方式重新命名和刪除檔案。

以下是重新命名現有檔案 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 )

檔案查詢

以下命令在開啟檔案之前測試檔案是否存在:

#!/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.unlinkDir.rmdir 執行完全相同的函式,併為方便起見提供。

Dir.delete("testdir")

建立檔案和臨時目錄

臨時檔案是在程式執行期間可能短暫建立但不是永久資訊儲存的檔案。

Dir.tmpdir 提供當前系統上臨時目錄的路徑,但預設情況下此方法不可用。要使 Dir.tmpdir 可用,需要使用 require 'tmpdir'。

您可以將 Dir.tmpdirFile.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 內建函式:

廣告
© . All rights reserved.