組み込みクラス: 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
}