現在讓我們再學習幾種檔案操作。我們將編寫一個 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()` 的原因。
- 笨方法更简单
- 习题 0: 准备工作
- 习题 1: 第一个程式
- 习题 2: 注释和井号
- 习题 3: 数字和数学计算
- 习题 4: 变数(variable)和命名
- 习题 5: 更多的变数和印出
- 习题 6: 字串(string)和文字
- 习题 7: 更多印出
- 习题 8: 印出,印出
- 习题 9: 印出,印出,印出
- 习题 10: 那是什么?
- 习题 11: 提问
- 习题 12: 模组 (Module)
- 习题 13: 参数、解包、参数
- 习题 14: 提示和传递
- 习题 15: 读取档案
- 习题 16: 读写档案
- 习题 17: 更多的档案操作
- 习题 18: 命名、变数、程式码、函式
- 习题 19: 函式和变数
- 习题 20: 函式和档案
- 习题 21: 函式可以传回东西
- 习题 22: 到现在你学到了哪些东西?
- 习题 23: 阅读一些程式码
- 习题 24: 更多练习
- 习题 25: 更多更多的练习
- 习题 26: 恭喜你,现在来考试了!
- 习题 27: 记住逻辑关系
- 习题 28: 布林(Boolean)表示式练习
- 习题 29: 如果(if)
- 习题 30: Else 和 If
- 习题 31: 做出决定
- 习题 32: 回圈和阵列
- 习题 33: While 回圈
- 习题 34: 存取阵列里的元素
- 习题 35: 分支 (Branches) 和函式 (Functions)
- 习题 36: 设计和测试
- 习题 37: 复习各种符号
- 习题 38: 阅读程式码
- 习题 39: 阵列的操作
- 习题 40: Hash, 可爱的 Hash
- 习题 41: 来自 Percal 25 号行星的哥顿人(Gothons)
- 习题 42: 物以类聚
- 习题 43: 你来制作一个游戏
- 习题 44: 评估你的游戏
- 习题 45: 物件、类和从属关系
- 习题 46: 一个专案骨架
- 习题 47: 自动化测试
- 习题 48: 更进阶的使用者输入
- 习题 49: 创造句子
- 习题 50: 你的第一个网站
- 习题 51: 从浏览器中取得输入
- 习题 52: 创造你的网页游戏
- 下一步
- 一个老程式设计师的建议