組み込みクラス: Dir/File編
逃げ続けてきた範囲だが、大きな弱点になっている気がしたので、試験直前だが復習してみる。
Dir Class
open/close
openメソッドはブロックをとることが出来、ブロックを閉じたところで、自動的にcloseさせることが出来る。
また、ブロック内でDirクラスのインスタンスに対してpath
メソッドを実行することで、開いているディレクトリのパスを取得することが出来る。
getwd/pwd
カレントディレクトリの取得を行うことができる。
chdir
ディレクトリを変更する。引数が与えられていなければ、環境変数に従ってhomeまで移動する。
irb(main):001:0> Dir.getwd => "C:/Users/broad/Desktop" irb(main):002:0> Dir.chdir => 0 irb(main):003:0> Dir.getwd => "C:/Users/broad"
また、chdirもブロックをとることが出来、ブロックの外にいくと再び元のディレクトリに戻る。
Dir.chdir("C:\\Users\\broad\\OneDrive"){ p Dir.pwd dir = Dir.open("C:\\Users\\broad\\OneDrive") dir.each{ |dir| puts dir } } p Dir.getwd
PS C:\Users\broad\Desktop> ruby .\dir.rb "C:/Users/broad/OneDrive" 1st Semester 単位互換用資料 2nd Semester単位互換用資料 Attachments AWS BaseBallBearLOCKS desktop.ini Dialy0526.txt Documents LINE Talk History products 個人用 Vault.lnk 画像 留学レポートⅠ.docx 留学レポートⅡ.docx 経済思想史 英語圏の言葉と文化課題 "C:/Users/broad/Desktop"
最後の出力はブロックの外に出ているので、元のディレクトリに戻っている。
mkdir/rmdir
dir_path = "C:\\Users\\broad\\OneDrive" Dir.chdir(dir_path){ dirs = [] created_dir = "" Dir.open(dir_path).each{ |dir| dirs << dir } Dir.mkdir(dir_path + "\\test_dir",0755) Dir.open(dir_path).each{ |dir| created_dir = dir unless dirs.include?(dir) } p created_dir }
File Class
open, read
openメソッドはDirと同じように、ブロックを渡すことで、ブロックの末尾で自動的に閉じることが出来る。
ファイルのオープンモードに関しては既に前の記事で取り扱っている。
File.open の引数
Ruby silver模擬試験誤答一覧 その2 - Pyons Tech Blog
この他Fileクラスにはファイルの属性を調べる様々なメソッドが用意されている。このメソッドは頻出なのでよく覚えておくこと。
dir_path = "C:\\Users\\broad\\OneDrive" Dir.chdir(dir_path){ Dir.mkdir(dir_path.concat("\\test_dir"),0755) Dir.chdir(dir_path) Dir.open(dir_path){ file_name = "new_file.txt" File.open(file_name,"w+"){ |file| file.write("This file is created from Ruby File \r\n Hello World!!") } puts "BaseName: #{File.basename(file_name)}" # ファイル名取得 puts "Dir Name: #{File.dirname(file_name)}" # ディレクトリ名の取得 puts "Ext Name: #{File.extname(file_name)}" # 拡張子の取得 puts "SplitName: #{File.split(file_name)}" # ディレクトリ名とファイル名の配列 puts "File Stat: #{File.stat(file_name).inspect} " # File::Statクラスのオブジェクト、ファイルの属性を示している puts "File atim: #{File.atime(file_name)}" # atime: 最終アクセス時刻 ctile: 状態が変更された時刻 mtime: 最終更新時刻 } }
PS C:\Users\broad\Desktop> ruby .\dir.rb ./dir.rb:6: warning: conflicting chdir during another chdir block BaseName: new_file.txt Dir Name: . Ext Name: .txt SplitName: [".", "new_file.txt"] File Stat: #<File::Stat dev=0x2, ino=2533274791039135, mode=0100644, nlink=1, uid=0, gid=0, rdev=0x2, size=53, blksize=nil, blocks=nil, atime=2019-09-28 13:28:57 +0900, mtime=2019-09-28 13:28:57 +0900, ctime=2019-09-28 13:28:57 +0900> File atim: 2019-09-28 13:28:57 +0900
ファイルをテストする
ファイルの編集の他にもファイルをテストするFileTestモジュール
が用意されている。
dir_path = "C:\\Users\\broad\\OneDrive" Dir.chdir(dir_path){ extend_path = "\\test_dir\\new_file.txt" puts "Exist?: #{File.exist?(dir_path + extend_path)}" puts "File? : #{File.file?(dir_path + extend_path)}" puts "Directory? : #{File.directory?(dir_path)}" puts "Executable?: #{File.executable?(dir_path + extend_path)}" puts "Readable? : #{File.readable?(dir_path + extend_path)} " puts "Writeable? : #{File.writable?(dir_path + extend_path)}" puts "Size? : #{File.size(dir_path + extend_path)}" }
PS C:\Users\broad\Desktop> ruby .\dir.rb Exist?: true File? : true Directory? : true Executable?: false Readable? : true Writeable? : true Size? : 53
ファイルの属性を変更する
最新更新日や属性を変更するためのメソッドが用意されている。
dir_path = "C:\\Users\\broad\\OneDrive" Dir.chdir(dir_path){ extend_path = "\\test_dir\\new_file.txt" puts "atime" + File.atime(dir_path + extend_path).to_s puts "ctime" + File.ctime(dir_path + extend_path).to_s puts "mtime" + File.mtime(dir_path + extend_path).to_s File.utime(Time.new(1996,06,13),Time.new(1999,04,10),dir_path + extend_path) puts "atime" + File.atime(dir_path + extend_path).to_s puts "ctime" + File.ctime(dir_path + extend_path).to_s puts "mtime" + File.mtime(dir_path + extend_path).to_s }
PS C:\Users\broad\Desktop> ruby .\dir.rb atime2019-09-28 13:28:57 +0900 ctime2019-09-28 13:28:57 +0900 mtime2019-09-28 13:28:57 +0900 atime1996-06-13 00:00:00 +0900 ctime2019-09-28 13:28:57 +0900 mtime1999-04-10 00:00:00 +0900
絶対パスを取得する
dir_path = "C:\\Users\\broad\\OneDrive" Dir.chdir(dir_path){ p Dir.pwd Dir.open("./test_dir") p Dir.pwd puts File.expand_path("new_file.text").to_s }
PS C:\Users\broad\Desktop> ruby .\dir.rb "C:/Users/broad/OneDrive" "C:/Users/broad/OneDrive" C:/Users/broad/OneDrive/new_file.text
ファイルを切り詰める
dir_path = "C:\\Users\\broad\\OneDrive\\test_dir" Dir.chdir(dir_path){ File.open("new_file.txt"){ |file| p file.read } File.truncate("new_file.txt",30) File.open("new_file.txt"){ |file| p file.read } }
PS C:\Users\broad\Desktop> ruby .\dir.rb "This file is created from Ruby File \r\n Hello World!!" "This file is created from Ruby"
削除にはunlink
というメソッドが用いられる。
dir_path = "C:\\Users\\broad\\OneDrive\\test_dir" all_files_previous = [] all_files_new = [] Dir.chdir(dir_path){ Dir.open("."){ |file| all_files_previous << file } File.unlink("new_file.txt") Dir.open("."){ |file| all_files_new << file } puts all_files_previous - all_files_new }