转载自http://hi.baidu.com/rubyonrailsjie/blog/item/28f683f319484314b17ec57c.html
1 打开和关闭一个文件
类方法File.new 打开一个文件,并将它实例化为一个File对象,他的第一个参数是文件名.可选的第二个参数叫做 mode string(这个也是从c得来的).他的意思是怎样打开一个文件(读,写或者其他的).默认是'r'(也就是读).
- file1 = File.new("one") # Open for reading
- file2 = File.new("two", "w") # Open for writing
- file = File.new("three", 0755, File::CREAT|File::WRONLY)
出于对操作系统和运行环境的考虑,如果你打开了一个文件的话,你就必须关闭它。当你打开一个文件用于写时,你更应该这样做,从而才能免于丢失数据.close方法就是关闭一个文件:
- out = File.new("captains.log", "w")
- # Process as needed...
- out.close
这里还有一个open方法,它的最简单的形式是和new同义的:
- trans = File.open("transactions","w")
但是open方法还能够带一个block作为参数,当存在block时,打开的文件将会做为一个参数传递给block.这时这个文件将会在这个block的作用域里,保持打开,直到block结束时,自动关闭:
- File.open("somefile","w") do |file|
- file.puts "Line 1"
- file.puts "Line 2"
- file.puts "Third and final line"
- end
2 更新文件
假设我们想要打开一个文件用于读和写,简单的加一个'+'号到file mode就行了:
- f1 = File.new("file1", "r+")
- # Read/write, starting at beginning of file.
- f2 = File.new("file2", "w+")
- # Read/write; truncate existing file or create a new one.
- f3 = File.new("file3", "a+")
- # Read/write; start at end of existing file or create a
- # new one.
3 追加一个文件
假设我们想要追加一段信息到一个存在文件,当我们打开文件时使用'a'作为file mode就行了:
- logfile = File.open("captains_log", "a")
- # Add a line at the end, then close.
- logfile.puts "Stardate 47824.1: Our show has been canceled."
- logfile.close
4随机存取一个文件
如果你想随即存取一个文件,你能够使用seek方法,它是File从Io继承而来的.它的最简单的使用就是指定一个字节位置.这个位置是相对于文件开始的位置(开始的位置是0):
- # myfile contains only: abcdefghi
- file = File.new("myfile")
- file.seek(5)
- str = file.gets # "fghi"
如果你能确定每一行都是固定的长度,你就能seek指定的行:
- # Assume 20 bytes per line.
- # Line N starts at byte (N-1)*20
- file = File.new("fixedlines")
- file.seek(5*20) # Sixth line!
- # Elegance is left as an exercise.
- file = File.new("somefile")
- file.seek(55) # Position is 55
- file.seek(-22, IO::SEEK_CUR) # Position is 33
- file.seek(47, IO::SEEK_CUR) # Position is 80
你也能从文件的结束位置开始搜索:
- file.seek(-20, IO::SEEK_END) # twenty bytes from eof
- file.seek(20)
- pos1 = file.tell # 20
- file.seek(50, IO::SEEK_CUR)
- pos2 = file.pos # 70
5 操作二进制文件
在很久以前,c语言通过在file mode后附加一个'b'来表示将文件用二进制模式打开.在今天,二进制文件的处理已经没有那么麻烦了。在ruby中,一个字符串很容易保存一个二进制数据,而且也不用通过任何特殊的方式来读文件.
可是在windows下是例外,在他下面,二进制文件和文本文件的不同是,在二进制mode下,结束行不能被转义为一个单独的换行,而是被保存为一个回车换行对.
另外的不同是,在文本模式下 control-Z被作为文件的结束:
- # Create a file (in binary mode)
- File.open("myfile","wb") {|f| f.syswrite("12345\0326789\r") }
- # Above note the embedded octal 032 (^Z)
- # Read it as binary
- str = nil
- File.open("myfile","rb") {|f| str = f.sysread(15) }
- puts str.size # 11
- # Read it as text
- str = nil
- File.open("myfile","r") {|f| str = f.sysread(15) }
- puts str.size # 5
再看下面的代码:
- # Input file contains a single line: Line 1.
- file = File.open("data")
- line = file.readline # "Line 1.\n"
- puts "#{line.size} characters." # 8 characters
- file.close
- file = File.open("data","rb")
- line = file.readline # "Line 1.\r\n"
- puts "#{line.size} characters." # 9 characters 二进制模式的结尾是一个回车换行对.
- file.close
- file = File.open("data")
- file.binmode
- line = file.readline # "Line 1.\r\n"
- puts "#{line.size} characters." # 9 characters
- file.close
- input = File.new("myfile",'a+')
- output = File.new("outfile",'a+')
- instr = input.sysread(10);
- puts instr
- bytes = output.syswrite("This is a test.")
这边要注意 Array 的pack和string的unpack方法,对于处理二进制数据非常有用.