現在讓我們再學習幾種文件操作。我們將編寫一個 Ruby 腳本,將一個文件中的內容拷貝到另一個文件中。這個腳本很短,不過它會讓你對于文件操作有更多的了解。
~~~
from_file, to_file = ARGV
script = $0
puts "Copying from #{from_file} to #{to_file}"
# we could do these two on one line too, how?
input = File.open(from_file)
indata = input.read()
puts "The input file is #{indata.length} bytes long"
puts "Does the output file exist? #{File.exists? to_file}"
puts "Ready, hit RETURN to continue, CTRL-C to abort."
STDIN.gets
output = File.open(to_file, 'w')
output.write(indata)
puts "Alright, all done."
output.close()
input.close()
~~~
你應該注意到了我們使用了一個很好用的函數 `File.exists`?。運作原理是將文件名字當做一個參數傳入,如果文件存在的話,它會傳回 `true`,如果不存在的話就返回 `false`。之后在這本書中,我們將會使用這個函數做更多的事情。
# 你應該看到的結果
* * * * *
如同你前面所寫的腳本,運行該腳本需要兩個參數,一個是待拷貝的文件位置,一個是要拷貝至的文件位置。如果我們使用以前的 `test.txt` 我們將看到如下的結果:
~~~
$ ruby ex17.rb test.txt copied.txt
Copying from test.txt to copied.txt
The input file is 81 bytes long
Does the output file exist? False
Ready, hit RETURN to continue, CTRL-C to abort.
Alright, all done.
$ cat copied.txt
To all the people out there.
I say I don't like my hair.
I need to shave it off.
$
~~~
該命令對于任何文件應該都是有效的。試試操作一些別的文件看看結果。不過當心別把你的重要文件給弄壞了。
> Warning: 你看到我用 cat 這個指令了吧?它只能在 Linux 和 OX 下使用,Windows 用戶可以使用 type 做到相同效果。
# 加分習題
* * * * *
1. 再多讀讀和 `require` 相關的資料,然后將 IRB 跑起來,試試 require 一些東西看能不能摸出門到。當然,即使搞不清楚也沒關系。
2. 這個腳本實在有點煩人。沒必要再拷貝之前都問一遍吧,沒必要在屏幕上輸出那么多東西。試著刪掉腳本的一些功能,使它用起來更友好。
3. 看看你能把這個腳本改到多短,我可以把它寫成一行。
4. 我使用了一個叫 `cat` 的東西,這個古老的命令用處是將兩個文件「連接(con_cat_enate)」在一起,不過實際上它最大的用處是輸出文件內容到屏幕是。你可以通過 `man cat` 命令了解到更多資訊。
5. 使用 Windows 的人,你們可以給自己找一個 cat 的替代品。關于 man 的東西就別想太多了。Windows 下沒這個指令。
6. 找出為什么需要在代碼中寫` output.close() `的原因。
- 笨方法更簡單
- 習題 00: 準備工作
- 習題 01: 第一個程序
- 習題 02: 注釋和#號
- 習題 03: 數字和數學計算
- 習題 04: 變量的命名
- 習題 05: 更多的變量和輸出
- 習題 06: 字符串和文字
- 習題 07: 更多輸出
- 習題 08: 輸出,輸出
- 習題 09: 輸出,輸出,輸出~
- 習題 10: 那是啥?
- 習題 11: 提問
- 習題 12: 模塊
- 習題 13: 參數,解包,參數
- 習題 14: 提示和傳遞
- 習題 15: 讀取文件
- 習題 16: 操作文件
- 習題 17: 更多的文件操作
- 習題 18: 命名,變量,代碼,函數
- 習題 19: 函數和變量
- 習題 20: 函數和文件
- 習題 21: 函數可以傳入信息
- 習題 22: 到現在你學到了什么?
- 習題 23: 閱讀一些代碼
- 習題 24: 更多練習
- 習題 25: 更多更多的練習
- 習題 26: 恭喜你,現在來考試了!
- 習題 27: 記住邏輯關系
- 習題 28: Boolean表達式練習
- 習題 29: 如果
- 習題 30: Else 和 If
- 習題 31: 做出判斷
- 習題 32: 循環和數組
- 習題 33: While
- 習題 34: 存取數組里的元素
- 習題 35: 分支和函數
- 習題 36: 設計和測試
- 習題 37: 重視各種符號