- Ruby 基礎
- Ruby - 首頁
- Ruby - 概述
- Ruby - 環境設定
- Ruby - 語法
- Ruby - 類和物件
- Ruby - 變數
- Ruby - 運算子
- Ruby - 註釋
- Ruby - IF...ELSE
- Ruby - 迴圈
- Ruby - 方法
- Ruby - 塊
- Ruby - 模組
- Ruby - 字串
- Ruby - 陣列
- Ruby - 雜湊表
- Ruby - 日期和時間
- Ruby - 範圍
- Ruby - 迭代器
- Ruby - 檔案 I/O
- Ruby - 異常
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.open 和 File.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 中的 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("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.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 內建函式: