ruby学習のIO(一)


ファイルとディレクトリの操作
rubyのファイルとディレクトリの操作は基本的にFileとDirクラスの操作に基づいています
Fileクラスのインスタンスを作成するには
file = File.new("d:/text.txt") 
file = File.open("d:/text.txt","w")

 
Fileでよく使用されるインスタンスメソッドは、次のとおりです.
atime:ファイルの最後のアクセス時間を返します.Timeオブジェクト
stat:ファイルの状態情報オブジェクトを返します.FIle::Statのインスタンスです.このオブジェクトからファイルの作成変更時間やサイズなどの情報を得ることができます.
mtime:ファイルの最終変更時間を返す
path:ファイルの完全なパスを返す
each(separator="){|line|block}:読み出しファイルをseparatorパラメータで分割し、デフォルトでは行ごとに分割し、ファイルの1行の内容をコードブロックに転送するたびに実行します.
each_byte{|byte|block}:ファイルのバイトごとに反復実行
each_line{|line|block}:ファイルの行ごとに反復実行
eof:ファイルの最後に読み込むとtrueを返し、そうでない場合falseを返します.
gets:ファイルの次の行を読み込み、返します.
puts(obj)/print(ojb)/write(string):コンテンツをファイルに書き込む
lineno/lineno=:現在の行番号を返すか設定します.
pos/pos=:現在の読み出しのバイトオフセットを返したり設定したり
Fileでよく使われるクラスメソッドは
delete(filename):ファイルを削除する
directory?(path):ディレクトリかどうか
exist?(filename):ファイル後のディレクトリが存在するかどうか
expand_Path(filename):絶対パスに変換
file?(filename):通常ファイルかどうか
rename(oldname,newname):名前の変更
size(filename):指定したファイルのバイトサイズを返します.
使用例:
file_path = "d:/text.txt"
if File.exist?(file_path)
  puts "     !"
  file = File.new(file_path, "r")
  puts "      :#{File.size(file_path)},     :#{file.ctime},       :#{file.atime}"
else
  puts "     ,     #{file_path}"
end
puts "      ..."


File.open(file_path, "a+") do |file|
  #       
  file.puts "    "+Time.now.strftime("%Y-%m-%d %H:%M:%S")
end

puts "      ====="
File.open(file_path, "r")do |file|
  #         
  file.each_line do |line|
    puts "  "+file.lineno.to_s+":"+line
  end
end

 
Dirクラスでよく使われるクラスメソッドは次のとおりです.
chdir(filename):プロセスの現在の作業ディレクトリを変更し、パラメータは相対パスを使用できます.
getwd/pwd:現在の作業ディレクトリを返します
delete(dirname)/rmdir(dirname):指定したディレクトリを削除し、ディレクトリが空でない場合に例外を引き起こします.
entries(dirname):指定されたディレクトリ内のすべてのファイル名からなる配列を返します.
foreach(dirname):指定されたディレクトリの各項目を反復します.
mkdir(dirname):ディレクトリの作成
glod(glod_pattern):モードglodを使用patternは現在のディレクトリで一致するサブディレクトリまたはファイルを検索し、配列でDirを返す方法[]はglod、例えばDirを呼び出すことに等しい.glod(*.rb)とDir[*.rb]]は、すべての接尾辞がrbであるファイルを返すために
 
例:
dirpath = "d:/test"
testdirpath = "d:/test/testdir"
Dir.delete(testdirpath) if File.exist?(testdirpath)
puts "    #{testdirpath}"
#    
Dir.mkdir(testdirpath)

#       dirpath     ,           ,           
Dir.chdir(dirpath) do |path|
  puts "     #{Dir.pwd},         :"
  #             ,           (       )
  Dir["**/**"].each { |item| puts item }
end

puts "     :#{Dir.pwd},         :"
#  Dir foreach  
Dir.foreach(Dir.pwd) do |dir|
  puts dir
end

=begin
    :
    d:/test/testdir
     d:/test,         :
test.txt
test.xml
testdir
     :D:/myruby/study/RubyStudy/lib,         :
.
..
main.rb
=end

 
操作xml
単純なxml操作でxmlクリップを生成
require "rexml/document"
doc = REXML::Document.new
root_element = doc.add_element("persons",{"nameType"=>"String","ageType"=>"int"})
element1 = root_element.add_element("person",{"name"=>"  ","age"=>20})
element2 = root_element.add_element("person",{"name"=>"  ","age"=>22})
element1.add_text "     "
element2.add_text "     "

#puts root_element.to_s
#     
File.open("d:/test/rubytest.xml", "w+") { |file| file.write(root_element.to_s)  }

#    
rdoc = REXML::Document.new File.new("d:/test/rubytest.xml")

rdoc.root.each_element do |e|
  puts e.attributes["name"]
  puts e.attributes["age"]
  puts e.text
end

 
出力:
  
20
     
  
22