SlideShare a Scribd company logo
Ruby の Dir、File、IO について
2018/7/10
大手町.rb #8
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
1自己紹介
Tomoya Kawanishi a.k.a. @cuzic
エネチェンジ株式会社 チーフエンジニア
電力会社、ガス会社を切り替えるなら、エネチェンジ経由で!
一般家庭も!法人も!Ruby関西の中の人
Ruby関西の中の人
発表者として登壇くださる方、あとで声かけください。
Rubyビジネス創出展 7月20日(金)セミナーで講演予定
大阪Ruby会議01 7月21日(土)
大手町.rb の中の人
毎月 大手町.rb の開催を予定
東京駅、各線大手町駅から直結!
Ruby の初級者がメインターゲット
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
今日のテーマ
Dir、File、IO
ファイルの入出力は頻出!
上記のクラス以外も含めて、いろんなテクを紹介します
2
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
Ruby でのファイル処理の特徴
Ruby は大クラス主義!
InputStream、BufferedInputStream、FileReader
みたいに似て非なるものがたくさんあったりしない
上みたいなのは IO で全部できる
File クラスにもたくさんメソッドがあってベンリ!
Ruby の IO はすごいっ!
低水準と高水準のメソッドが同居!
混ぜるな危険じゃない!混ぜても使えて便利。
標準添付ライブラリが超イケてる!
Find、FileUtils、pathname
今回は特に私が有用だと思ったものを中心に紹介します
3
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
Dir.glob、 Dir.[]
Dir.glob でパターンにマッチしたファイルを一発で取得できる
超便利
Dir.new とか Dir#each とかはタルくて使ってられない。
4
Dir["config.?"] #=> ["config.h"]
Dir.glob("config.?") #=> ["config.h"]
Dir.glob("*.[a-z][a-z]") #=> ["main.rb"]
Dir.glob("*.[^r]*") #=> ["config.h"]
Dir.glob("*.{rb,h}") #=> ["main.rb", "config.h"]
Dir.glob("*") #=> ["config.h", "main.rb"]
Dir.glob("*", File::FNM_DOTMATCH) #=> [".", "..", "config.h", "main.rb"]
rbfiles = File.join("**", "*.rb")
Dir.glob(rbfiles) #=> ["main.rb", "lib/song.rb", "lib/song/karaoke.rb"]
Dir.glob(rbfiles, base: "lib") #=> ["song.rb", "song/karaoke.rb"]
libdirs = File.join("**", "lib")
Dir.glob(libdirs) #=> ["lib"]
librbfiles = File.join("**", "lib", "**", "*.rb")
Dir.glob(librbfiles) #=> ["lib/song.rb", "lib/song/karaoke.rb"]
librbfiles = File.join("**", "lib", "*.rb")
Dir.glob(librbfiles) #=> ["lib/song.rb"]
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
Dir.chdir
いわゆる cd
ディレクトリを移動できる
do ~ end の中だけ該当のディレクトリ
抜けると元に戻る
5
Dir.chdir("/var/spool/mail")
puts Dir.pwd
Dir.chdir("/tmp") do
puts Dir.pwd
Dir.chdir("/usr") do
puts Dir.pwd
end
puts Dir.pwd
end
puts Dir.pwd
/var/spool/mail
/tmp
/usr
/tmp
/var/spool/mail
/var/spool/mail /tmp /usr /tmp /var/spool/mail
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
Find.find
標準添付ライブラリ Find もベンリ
Find.find でそのディレクトリ以下のすべてのファイルを処理対象にできる
スキップした方がいいディレクトリについては Find.prune で抜けられる
6
require 'find'
total_size = 0
Find.find(Dir.home) do |path|
if File.directory?(path)
if File.basename(path).start_with?(".")
Find.prune # Don't look any further into this directory.
end
else
total_size += File.size(path)
end
end
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
File.atime, birthtime, ctime, mtime
atime で最終アクセス時刻、mtime で最終変更時刻を
取得できる
ctime は環境依存なので、利用には注意が必要。
Windows + NTFS などでは birthtime を使える
7
# atime 最終アクセス時刻。read しただけで更新される
File.atime("testfile") #=> Wed Apr 09 08:51:48 CDT 2003
# mtime 最終変更時刻(modify time)、ファイル内容を変更した場合に更新される
File.mtime("testfile") #=> Tue Apr 08 12:58:04 CDT 2003
# ctime 最終ステータス変更時刻(change time)
# ファイル内容、ファイル名、パーミッションを変更した場合に更新される
# ただし、Windows (NTFS) では creation time (birthtime)が返る
File.ctime("testfile") #=> Wed Apr 09 08:53:13 CDT 2003
# birth time (creation time) ファイル生成時刻 (ファイルシステムと OS依存)
File.birthtime("testfile") #=> Wed Apr 09 08:53:13 CDT 2003
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
File.basename、File.extname
File.basename
私自身は非常によく使う
ディレクトリ部分を取り除く。
引数を与えると、拡張子も取り除くことができる
File.extname
拡張子を取得できる
8
File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb"
File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
File.basename("/home/gumby/work/ruby.rb", ".*") #=> "ruby"
File.extname("test.rb") #=> ".rb"
File.extname("a/b/d/test.rb") #=> ".rb"
File.extname(".a/b/d/test.rb") #=> ".rb"
File.extname("foo.") #=> ""
File.extname("test") #=> ""
File.extname(".profile") #=> ""
File.extname(".profile.sh") #=> ".sh"
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
File.open
第2引数 mode で、読み込み用、書き込み用を指定可能
第2引数でファイルエンコーディングも指定可能
cr_newline のような String#encode のオプションも指定可能
ブロックの返り値が File.open の返り値
9
# "r" 読み込みモード、"w" 書き込みモード、 "a" 追記モード
body = File.open("testfile", "r") do |f| f.read; end
File.open("newfile", "w") do |f| f.write body; end
File.open("newfile", File::CREAT|File::TRUNC|File::RDWR, 0644) do |f|
f.write body
end
File.open("unicode.txt", mode: 'w:UTF-16LE', cr_newline: true) do |f|
f.puts "Hello, World!"
end
File.open("another_unicode.txt", mode: 'w', cr_newline: true,
external_encoding: Encoding::UTF_16LE) do |f|
f.puts "Hello, World!"
end
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
File.directory?、zero?、exist?、file? ほか
File.directory? : 引数がディレクトリなら true
File.exist? : 引数のファイルが存在すれば true
File.file? : 引数が通常のファイルなら true
File.identical? : 引数を2つとり、同一のファイルなら true
File.readable? : そのファイルが読み込み可能なら true
File.size? : ファイルが存在し、ファイルサイズがゼロでなければ true
File.symlink? : シンボリックファイルなら true
File.writable? : 書き込み可能なら true
File.zero? : ファイルが存在しファイルサイズがゼロならtrue
10
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
FileUtils
FileUtils モジュールを使うとファイルの作成、コピー、削除等がカ
ンタンに利用できる
デバッグ出力もカンタン
11
require 'fileutils'
FileUtils.cd(dir, options)
FileUtils.cd(dir, options) do |dir|
block
end
FileUtils.pwd()
FileUtils.mkdir(dir, options)
FileUtils.mkdir(list, options)
FileUtils.mkdir_p(dir, options)
FileUtils.mkdir_p(list, options)
FileUtils.rmdir(dir, options)
FileUtils.rmdir(list, options)
FileUtils.ln(target, link, options)
FileUtils.ln(targets, dir, options)
FileUtils.ln_s(target, link, options)
FileUtils.ln_s(targets, dir, options)
FileUtils.ln_sf(target, link, options)
FileUtils.cp(src, dest, options)
FileUtils.cp(list, dir, options)
FileUtils.cp_r(src, dest, options)
FileUtils.cp_r(list, dir, options)
FileUtils.mv(src, dest, options)
FileUtils.mv(list, dir, options)
FileUtils.rm(list, options)
FileUtils.rm_r(list, options)
FileUtils.rm_rf(list, options)
FileUtils.install(src, dest, options)
FileUtils.chmod(mode, list, options)
FileUtils.chmod_R(mode, list, options)
FileUtils.chown(user, group, list,
options)
FileUtils.chown_R(user, group, list,
options)
FileUtils.touch(list, options)
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
IO.read、IO.write
IO.read : ファイルの内容を取得できる
IO.write : ファイルに引数の内容を書き込む
12
IO.read("testfile") #=> "This is line one¥nThis is line
two¥nThis is line three¥nAnd so on...¥n"
IO.write("testfile", "0123456789") #=> 10
# File would now read: "0123456789"
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
IO#each_line、IO#each_char ほか
IO#each_byte :1バイトごと
IO#each_char :1文字ごと
IO#each_codepoint :
コードポイントごと
IO#each_line :1行ごと
13
File.open("testfile") do |f|
f.each_line do |line|
puts "#{f.lineno}: #{line}"
end
end
File.open("testfile") do |f|
checksum = 0
f.each_byte do |byte|
checksum ^= byte
end
end
File.open("testfile") do |f|
f.each_char do |char|
print char
end
end
File.open("testfile") do |f|
f.each_codepoint.with_index do |codepoint, index|
puts "#{index}: #{[codepoint].pack("U")} #{codepoint}"
end
end
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
STDIN、STDOUT、STDERR
STDIN:標準入力、$stdin のデフォルト値
STDOUT:標準出力、$stdout のデフォルト値
STDERR: 標準エラー出力、$stderr のデフォルト値
$stdin: Kernel.gets や Kernel.each_line で使われる
$stdout:Kernel.puts や Kernel.p で使われる
$stderr:Kernel.warn で使われる
普通は f.puts などとして出力するが、
下記のようにするとより簡潔に書くこともできる。
14
File.open("tempfile") do |f|
$stdout = f
puts "0123456"
$stdout = STDOUT
end
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
StringIO
IO のメソッド群で String を作れる
さっきの $stdout と組合わせるテクもある
ピンポイントで使わないとわりと混乱する
用量・用法を守ってお使いください
15
require 'stringio'
io = StringIO.new
io.puts "Hello World"
io.string #=> "Hello World¥n"
require 'stringio'
io = $stdout = StringIO.new
puts "Hello World"
$stdout = STDOUT
puts s.string #=> "Hello World¥n"
require 'stringio'
str = StringIO.open("") do |io|
$stdout = io
puts "Hello World"
$stdout = STDOUT
io.string
end
puts str #=> "Hello World¥n"
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
ARGF
ARGV をファイル名の配列とみなして、
そのファイルの内容を簡単に ARGF でアクセスできる
事前にコマンドラインオプションを除去する必要がある
16
$ cat foo
qwe
123
bar
$ cat foo | ruby -e 'ARGF.each_line { |l| puts l.chop.reverse }'
ruby -e 'ARGF.each_line { |l| puts l.chop.reverse }' foo
ruby -lpe '$_.reverse!' foo
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
Pathname
いろんな機能がてんこ盛りの façade クラス
Pathname.glob : Pathname を yield する Dir.glob
Pathname#+, / : Pathname way な文字列連結
Pathname#atime, mtime, ctime, open, basename
File の同名メソッドと同一
Pathname#exist?, file?, size?, writable? ほか
FileTest の同名メソッドと同一
Pathname#each_line, read
IO の同名メソッドと同一
17
Rails.root #=> "."
Rails.root + "bin/rails" #=> "./bin/rails"
大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」
まとめ
今回は Ruby でディレクトリやファイルを扱う方法を紹
介しました。
Ruby は大クラス主義
たくさんのベンリなメソッドが少数のクラスにある
高水準なメソッドがたくさんあって使いやすい
標準添付ライブラリもベンリ!
find、fileutils、pathname、stringio
さくっと書きたいときに便利な ARGF
18
ご清聴ありがとう
ございました

More Related Content

PDF
研究分野をサーベイする
PPTX
Redisの特徴と活用方法について
PDF
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
PDF
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
PPTX
徳丸本に載っていないWebアプリケーションセキュリティ
PPTX
新社会人が今すぐ使える、​ExcelでC#を使う方法
PPTX
優れた研究論文の書き方
PDF
Dockerイメージの理解とコンテナのライフサイクル
研究分野をサーベイする
Redisの特徴と活用方法について
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Zabbix最新情報 ~Zabbix 6.0に向けて~ @OSC2021 Online/Fall
徳丸本に載っていないWebアプリケーションセキュリティ
新社会人が今すぐ使える、​ExcelでC#を使う方法
優れた研究論文の書き方
Dockerイメージの理解とコンテナのライフサイクル

What's hot (20)

PDF
Kubernetesによる機械学習基盤への挑戦
PDF
犬でもわかる公開鍵暗号
PDF
オブジェクト指向できていますか?
PPTX
分散システムについて語らせてくれ
PDF
例外設計における大罪
PDF
コンテナの作り方「Dockerは裏方で何をしているのか?」
PDF
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
PDF
Docker Compose 徹底解説
PDF
テストとリファクタリングに関する深い方法論 #wewlc_jp
PDF
暗号技術の実装と数学
PPTX
本当は恐ろしい分散システムの話
PDF
ログ解析を支えるNoSQLの技術
PDF
Spring Boot × Vue.jsでSPAを作る
PPT
メタプログラミングって何だろう
PDF
何となく勉強した気分になれるパーサ入門
PDF
Docker 9 tips~意外と知られていない日常で役立つ便利技
PDF
Dockerfile を書くためのベストプラクティス解説編
PDF
Dockerからcontainerdへの移行
PPTX
世の中のPostgreSQLエンジニアのpsql設定(第34回PostgreSQLアンカンファレンス@オンライン 発表資料)
Kubernetesによる機械学習基盤への挑戦
犬でもわかる公開鍵暗号
オブジェクト指向できていますか?
分散システムについて語らせてくれ
例外設計における大罪
コンテナの作り方「Dockerは裏方で何をしているのか?」
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
SPAセキュリティ入門~PHP Conference Japan 2021
Docker Compose 徹底解説
テストとリファクタリングに関する深い方法論 #wewlc_jp
暗号技術の実装と数学
本当は恐ろしい分散システムの話
ログ解析を支えるNoSQLの技術
Spring Boot × Vue.jsでSPAを作る
メタプログラミングって何だろう
何となく勉強した気分になれるパーサ入門
Docker 9 tips~意外と知られていない日常で役立つ便利技
Dockerfile を書くためのベストプラクティス解説編
Dockerからcontainerdへの移行
世の中のPostgreSQLエンジニアのpsql設定(第34回PostgreSQLアンカンファレンス@オンライン 発表資料)
Ad

Similar to RubyのDir、File、IO について (20)

ODP
Rubyのソースコードを読んでみよう(入門編)
PPT
Start!! Ruby
PDF
Ruby の文字列について
PDF
Ruby 同好会宣言
PPTX
Ruby 勉強会 第42回 発表資料 IO について
ODP
とっとるびー(2回目)発表資料
PDF
Rubyの基礎@Webビギナーズ
PDF
現実世界のJRuby(ショートバージョン)
PDF
Ruby の String のメソッドについて
PDF
Ruby初級者向けレッスン KOF2015 出張版
PDF
What's Cooking In Ruby 2.7
PPTX
Ruby – The Scripting Language
PDF
ゼロからのプログラミングRails講座 Codeanywhere版
PPTX
第3回輪講
PDF
現実世界のJRuby
PDF
Ruby のワンライナーについて
PPTX
Ruby講座第二回
PDF
Ruby紹介3(pdf)
PDF
Ruby勉強会@札幌 "Rubyist入門講座"
Rubyのソースコードを読んでみよう(入門編)
Start!! Ruby
Ruby の文字列について
Ruby 同好会宣言
Ruby 勉強会 第42回 発表資料 IO について
とっとるびー(2回目)発表資料
Rubyの基礎@Webビギナーズ
現実世界のJRuby(ショートバージョン)
Ruby の String のメソッドについて
Ruby初級者向けレッスン KOF2015 出張版
What's Cooking In Ruby 2.7
Ruby – The Scripting Language
ゼロからのプログラミングRails講座 Codeanywhere版
第3回輪講
現実世界のJRuby
Ruby のワンライナーについて
Ruby講座第二回
Ruby紹介3(pdf)
Ruby勉強会@札幌 "Rubyist入門講座"
Ad

More from Tomoya Kawanishi (20)

PPTX
英単語の覚え方
PDF
ENECHANGE社での Scout APM 利用事例
PDF
エンジニア転職のノウハウ
PDF
Ruby on Rails のキャッシュ機構について
PDF
Ruby初心者からよく質問されること
PDF
RubyGems と Bundler について
PDF
Ruby の正規表現について
PDF
Ruby での外部コマンドの実行について
PDF
AWS のコスト管理をちゃんとしたくてやったこと
PDF
PostgreSQL のイケてるテクニック7選
PDF
HTTPと Webクローリングについて
PDF
Active record query interface
PDF
Active Support のコア拡張機能について
PDF
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
PDF
Thread の利用事例紹介
PDF
Ruby の制御構造とリテラルについて
PDF
RubyGems と Bundler について
PDF
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
PDF
マークアップで使えるRuby
PPTX
エネチェンジでの Side ci 利用事例について
英単語の覚え方
ENECHANGE社での Scout APM 利用事例
エンジニア転職のノウハウ
Ruby on Rails のキャッシュ機構について
Ruby初心者からよく質問されること
RubyGems と Bundler について
Ruby の正規表現について
Ruby での外部コマンドの実行について
AWS のコスト管理をちゃんとしたくてやったこと
PostgreSQL のイケてるテクニック7選
HTTPと Webクローリングについて
Active record query interface
Active Support のコア拡張機能について
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Thread の利用事例紹介
Ruby の制御構造とリテラルについて
RubyGems と Bundler について
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
マークアップで使えるRuby
エネチェンジでの Side ci 利用事例について

RubyのDir、File、IO について

  • 1. Ruby の Dir、File、IO について 2018/7/10 大手町.rb #8
  • 2. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 1自己紹介 Tomoya Kawanishi a.k.a. @cuzic エネチェンジ株式会社 チーフエンジニア 電力会社、ガス会社を切り替えるなら、エネチェンジ経由で! 一般家庭も!法人も!Ruby関西の中の人 Ruby関西の中の人 発表者として登壇くださる方、あとで声かけください。 Rubyビジネス創出展 7月20日(金)セミナーで講演予定 大阪Ruby会議01 7月21日(土) 大手町.rb の中の人 毎月 大手町.rb の開催を予定 東京駅、各線大手町駅から直結! Ruby の初級者がメインターゲット
  • 3. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 今日のテーマ Dir、File、IO ファイルの入出力は頻出! 上記のクラス以外も含めて、いろんなテクを紹介します 2
  • 4. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 Ruby でのファイル処理の特徴 Ruby は大クラス主義! InputStream、BufferedInputStream、FileReader みたいに似て非なるものがたくさんあったりしない 上みたいなのは IO で全部できる File クラスにもたくさんメソッドがあってベンリ! Ruby の IO はすごいっ! 低水準と高水準のメソッドが同居! 混ぜるな危険じゃない!混ぜても使えて便利。 標準添付ライブラリが超イケてる! Find、FileUtils、pathname 今回は特に私が有用だと思ったものを中心に紹介します 3
  • 5. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 Dir.glob、 Dir.[] Dir.glob でパターンにマッチしたファイルを一発で取得できる 超便利 Dir.new とか Dir#each とかはタルくて使ってられない。 4 Dir["config.?"] #=> ["config.h"] Dir.glob("config.?") #=> ["config.h"] Dir.glob("*.[a-z][a-z]") #=> ["main.rb"] Dir.glob("*.[^r]*") #=> ["config.h"] Dir.glob("*.{rb,h}") #=> ["main.rb", "config.h"] Dir.glob("*") #=> ["config.h", "main.rb"] Dir.glob("*", File::FNM_DOTMATCH) #=> [".", "..", "config.h", "main.rb"] rbfiles = File.join("**", "*.rb") Dir.glob(rbfiles) #=> ["main.rb", "lib/song.rb", "lib/song/karaoke.rb"] Dir.glob(rbfiles, base: "lib") #=> ["song.rb", "song/karaoke.rb"] libdirs = File.join("**", "lib") Dir.glob(libdirs) #=> ["lib"] librbfiles = File.join("**", "lib", "**", "*.rb") Dir.glob(librbfiles) #=> ["lib/song.rb", "lib/song/karaoke.rb"] librbfiles = File.join("**", "lib", "*.rb") Dir.glob(librbfiles) #=> ["lib/song.rb"]
  • 6. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 Dir.chdir いわゆる cd ディレクトリを移動できる do ~ end の中だけ該当のディレクトリ 抜けると元に戻る 5 Dir.chdir("/var/spool/mail") puts Dir.pwd Dir.chdir("/tmp") do puts Dir.pwd Dir.chdir("/usr") do puts Dir.pwd end puts Dir.pwd end puts Dir.pwd /var/spool/mail /tmp /usr /tmp /var/spool/mail /var/spool/mail /tmp /usr /tmp /var/spool/mail
  • 7. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 Find.find 標準添付ライブラリ Find もベンリ Find.find でそのディレクトリ以下のすべてのファイルを処理対象にできる スキップした方がいいディレクトリについては Find.prune で抜けられる 6 require 'find' total_size = 0 Find.find(Dir.home) do |path| if File.directory?(path) if File.basename(path).start_with?(".") Find.prune # Don't look any further into this directory. end else total_size += File.size(path) end end
  • 8. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 File.atime, birthtime, ctime, mtime atime で最終アクセス時刻、mtime で最終変更時刻を 取得できる ctime は環境依存なので、利用には注意が必要。 Windows + NTFS などでは birthtime を使える 7 # atime 最終アクセス時刻。read しただけで更新される File.atime("testfile") #=> Wed Apr 09 08:51:48 CDT 2003 # mtime 最終変更時刻(modify time)、ファイル内容を変更した場合に更新される File.mtime("testfile") #=> Tue Apr 08 12:58:04 CDT 2003 # ctime 最終ステータス変更時刻(change time) # ファイル内容、ファイル名、パーミッションを変更した場合に更新される # ただし、Windows (NTFS) では creation time (birthtime)が返る File.ctime("testfile") #=> Wed Apr 09 08:53:13 CDT 2003 # birth time (creation time) ファイル生成時刻 (ファイルシステムと OS依存) File.birthtime("testfile") #=> Wed Apr 09 08:53:13 CDT 2003
  • 9. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 File.basename、File.extname File.basename 私自身は非常によく使う ディレクトリ部分を取り除く。 引数を与えると、拡張子も取り除くことができる File.extname 拡張子を取得できる 8 File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb" File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby" File.basename("/home/gumby/work/ruby.rb", ".*") #=> "ruby" File.extname("test.rb") #=> ".rb" File.extname("a/b/d/test.rb") #=> ".rb" File.extname(".a/b/d/test.rb") #=> ".rb" File.extname("foo.") #=> "" File.extname("test") #=> "" File.extname(".profile") #=> "" File.extname(".profile.sh") #=> ".sh"
  • 10. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 File.open 第2引数 mode で、読み込み用、書き込み用を指定可能 第2引数でファイルエンコーディングも指定可能 cr_newline のような String#encode のオプションも指定可能 ブロックの返り値が File.open の返り値 9 # "r" 読み込みモード、"w" 書き込みモード、 "a" 追記モード body = File.open("testfile", "r") do |f| f.read; end File.open("newfile", "w") do |f| f.write body; end File.open("newfile", File::CREAT|File::TRUNC|File::RDWR, 0644) do |f| f.write body end File.open("unicode.txt", mode: 'w:UTF-16LE', cr_newline: true) do |f| f.puts "Hello, World!" end File.open("another_unicode.txt", mode: 'w', cr_newline: true, external_encoding: Encoding::UTF_16LE) do |f| f.puts "Hello, World!" end
  • 11. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 File.directory?、zero?、exist?、file? ほか File.directory? : 引数がディレクトリなら true File.exist? : 引数のファイルが存在すれば true File.file? : 引数が通常のファイルなら true File.identical? : 引数を2つとり、同一のファイルなら true File.readable? : そのファイルが読み込み可能なら true File.size? : ファイルが存在し、ファイルサイズがゼロでなければ true File.symlink? : シンボリックファイルなら true File.writable? : 書き込み可能なら true File.zero? : ファイルが存在しファイルサイズがゼロならtrue 10
  • 12. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 FileUtils FileUtils モジュールを使うとファイルの作成、コピー、削除等がカ ンタンに利用できる デバッグ出力もカンタン 11 require 'fileutils' FileUtils.cd(dir, options) FileUtils.cd(dir, options) do |dir| block end FileUtils.pwd() FileUtils.mkdir(dir, options) FileUtils.mkdir(list, options) FileUtils.mkdir_p(dir, options) FileUtils.mkdir_p(list, options) FileUtils.rmdir(dir, options) FileUtils.rmdir(list, options) FileUtils.ln(target, link, options) FileUtils.ln(targets, dir, options) FileUtils.ln_s(target, link, options) FileUtils.ln_s(targets, dir, options) FileUtils.ln_sf(target, link, options) FileUtils.cp(src, dest, options) FileUtils.cp(list, dir, options) FileUtils.cp_r(src, dest, options) FileUtils.cp_r(list, dir, options) FileUtils.mv(src, dest, options) FileUtils.mv(list, dir, options) FileUtils.rm(list, options) FileUtils.rm_r(list, options) FileUtils.rm_rf(list, options) FileUtils.install(src, dest, options) FileUtils.chmod(mode, list, options) FileUtils.chmod_R(mode, list, options) FileUtils.chown(user, group, list, options) FileUtils.chown_R(user, group, list, options) FileUtils.touch(list, options)
  • 13. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 IO.read、IO.write IO.read : ファイルの内容を取得できる IO.write : ファイルに引数の内容を書き込む 12 IO.read("testfile") #=> "This is line one¥nThis is line two¥nThis is line three¥nAnd so on...¥n" IO.write("testfile", "0123456789") #=> 10 # File would now read: "0123456789"
  • 14. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 IO#each_line、IO#each_char ほか IO#each_byte :1バイトごと IO#each_char :1文字ごと IO#each_codepoint : コードポイントごと IO#each_line :1行ごと 13 File.open("testfile") do |f| f.each_line do |line| puts "#{f.lineno}: #{line}" end end File.open("testfile") do |f| checksum = 0 f.each_byte do |byte| checksum ^= byte end end File.open("testfile") do |f| f.each_char do |char| print char end end File.open("testfile") do |f| f.each_codepoint.with_index do |codepoint, index| puts "#{index}: #{[codepoint].pack("U")} #{codepoint}" end end
  • 15. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 STDIN、STDOUT、STDERR STDIN:標準入力、$stdin のデフォルト値 STDOUT:標準出力、$stdout のデフォルト値 STDERR: 標準エラー出力、$stderr のデフォルト値 $stdin: Kernel.gets や Kernel.each_line で使われる $stdout:Kernel.puts や Kernel.p で使われる $stderr:Kernel.warn で使われる 普通は f.puts などとして出力するが、 下記のようにするとより簡潔に書くこともできる。 14 File.open("tempfile") do |f| $stdout = f puts "0123456" $stdout = STDOUT end
  • 16. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 StringIO IO のメソッド群で String を作れる さっきの $stdout と組合わせるテクもある ピンポイントで使わないとわりと混乱する 用量・用法を守ってお使いください 15 require 'stringio' io = StringIO.new io.puts "Hello World" io.string #=> "Hello World¥n" require 'stringio' io = $stdout = StringIO.new puts "Hello World" $stdout = STDOUT puts s.string #=> "Hello World¥n" require 'stringio' str = StringIO.open("") do |io| $stdout = io puts "Hello World" $stdout = STDOUT io.string end puts str #=> "Hello World¥n"
  • 17. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 ARGF ARGV をファイル名の配列とみなして、 そのファイルの内容を簡単に ARGF でアクセスできる 事前にコマンドラインオプションを除去する必要がある 16 $ cat foo qwe 123 bar $ cat foo | ruby -e 'ARGF.each_line { |l| puts l.chop.reverse }' ruby -e 'ARGF.each_line { |l| puts l.chop.reverse }' foo ruby -lpe '$_.reverse!' foo
  • 18. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 Pathname いろんな機能がてんこ盛りの façade クラス Pathname.glob : Pathname を yield する Dir.glob Pathname#+, / : Pathname way な文字列連結 Pathname#atime, mtime, ctime, open, basename File の同名メソッドと同一 Pathname#exist?, file?, size?, writable? ほか FileTest の同名メソッドと同一 Pathname#each_line, read IO の同名メソッドと同一 17 Rails.root #=> "." Rails.root + "bin/rails" #=> "./bin/rails"
  • 19. 大手町.rb #8 発表資料 「Rubyの Dir、File、IOについて」 まとめ 今回は Ruby でディレクトリやファイルを扱う方法を紹 介しました。 Ruby は大クラス主義 たくさんのベンリなメソッドが少数のクラスにある 高水準なメソッドがたくさんあって使いやすい 標準添付ライブラリもベンリ! find、fileutils、pathname、stringio さくっと書きたいときに便利な ARGF 18