加载中...

习题 17: 更多的档案操作


现在让我们再学习几种档案操作。我们将编写一个 Ruby 脚本,将一个档案中的内容拷贝到另一个档案中。这个脚本很短,不过它会让你对于档案操作有更多的了解。

  1. from_file, to_file = ARGV
  2. script = $0
  3. puts "Copying from #{from_file} to #{to_file}"
  4. # we could do these two on one line too, how?
  5. input = File.open(from_file)
  6. indata = input.read()
  7. puts "The input file is #{indata.length} bytes long"
  8. puts "Does the output file exist? #{File.exists? to_file}"
  9. puts "Ready, hit RETURN to continue, CTRL-C to abort."
  10. STDIN.gets
  11. output = File.open(to_file, 'w')
  12. output.write(indata)
  13. puts "Alright, all done."
  14. output.close()
  15. input.close()

你应该注意到了我们使用了一个很好用的函式 File.exists?。运作原理是将档名字串当做一个参数传入,如果档案存在的话,它会传回 true,如果不存在的话就传回 false。之后在这本书中,我们将会使用这个函式做更多的事情。

你应该看到的结果

如同你前面所写的脚本,运行该脚本需要两个参数,一个是待拷贝的档案位置,一个是要拷贝至的档案位置。如果我们使用以前的 test.txt 我们将看到如下的结果:

  1. $ ruby ex17.rb test.txt copied.txt
  2. Copying from test.txt to copied.txt
  3. The input file is 81 bytes long
  4. Does the output file exist? False
  5. Ready, hit RETURN to continue, CTRL-C to abort.
  6. Alright, all done.
  7. $ cat copied.txt
  8. To all the people out there.
  9. I say I don't like my hair.
  10. I need to shave it off.
  11. $

该命令对于任何档案应该都是有效的。试试操作一些别的档案看看结果。不过当心别把你的重要档案给弄坏了。

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() 的原因。

还没有评论.