SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
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
ご清聴ありがとう
ございました

Mais conteúdo relacionado

Mais procurados

テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツpospome
 
合同会社selfree 会社紹介資料
合同会社selfree 会社紹介資料合同会社selfree 会社紹介資料
合同会社selfree 会社紹介資料selfree LLC
 
ナレッジグラフとオントロジー
ナレッジグラフとオントロジーナレッジグラフとオントロジー
ナレッジグラフとオントロジーUniversity of Tsukuba
 
Azure OpenAI ServiceのChatGPT API と OpenAIのChatGPT APIの比較
Azure OpenAI ServiceのChatGPT API と OpenAIのChatGPT APIの比較Azure OpenAI ServiceのChatGPT API と OpenAIのChatGPT APIの比較
Azure OpenAI ServiceのChatGPT API と OpenAIのChatGPT APIの比較KazuoSuzuki6
 
明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリア
明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリア明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリア
明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリアDaiyu Hatakeyama
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことTomoya Kawanishi
 
心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話Yusuke Hisatsu
 
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメント
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメントDX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメント
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメントTakeshi Kakeda
 
Aws amplify studioが変えるフロントエンド開発の未来とは v2
Aws amplify studioが変えるフロントエンド開発の未来とは v2Aws amplify studioが変えるフロントエンド開発の未来とは v2
Aws amplify studioが変えるフロントエンド開発の未来とは v2Koitabashi Yoshitaka
 
[DO13] 楽天のクラウドストレージ使いこなし術 Azure と OSS で少しずつ進めるレガシー脱却
[DO13] 楽天のクラウドストレージ使いこなし術 Azure と OSS で少しずつ進めるレガシー脱却[DO13] 楽天のクラウドストレージ使いこなし術 Azure と OSS で少しずつ進めるレガシー脱却
[DO13] 楽天のクラウドストレージ使いこなし術 Azure と OSS で少しずつ進めるレガシー脱却de:code 2017
 
ヤフーのプライベートクラウドとクラウドエンジニアの業務について
ヤフーのプライベートクラウドとクラウドエンジニアの業務についてヤフーのプライベートクラウドとクラウドエンジニアの業務について
ヤフーのプライベートクラウドとクラウドエンジニアの業務についてYahoo!デベロッパーネットワーク
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」fukuoka.ex
 
ReDosトラック内発表資料
ReDosトラック内発表資料ReDosトラック内発表資料
ReDosトラック内発表資料Yujiro Yahata
 
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」fukuoka.ex
 
Web開発者が始める .NET MAUI Blazor App
Web開発者が始める .NET MAUI Blazor AppWeb開発者が始める .NET MAUI Blazor App
Web開発者が始める .NET MAUI Blazor AppTomomitsuKusaba
 
SNS運用代行サービス提案書
SNS運用代行サービス提案書SNS運用代行サービス提案書
SNS運用代行サービス提案書アルソネックス
 
グラフモデルとSoEとGraphQL データ指向アプリケーションデザインから見るGraphQL
グラフモデルとSoEとGraphQL データ指向アプリケーションデザインから見るGraphQLグラフモデルとSoEとGraphQL データ指向アプリケーションデザインから見るGraphQL
グラフモデルとSoEとGraphQL データ指向アプリケーションデザインから見るGraphQLYutaka Tachibana
 
.NET Core時代のCI/CD
.NET Core時代のCI/CD.NET Core時代のCI/CD
.NET Core時代のCI/CDYuta Matsumura
 

Mais procurados (20)

テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
Fiberの使いどころ
Fiberの使いどころFiberの使いどころ
Fiberの使いどころ
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
 
合同会社selfree 会社紹介資料
合同会社selfree 会社紹介資料合同会社selfree 会社紹介資料
合同会社selfree 会社紹介資料
 
ナレッジグラフとオントロジー
ナレッジグラフとオントロジーナレッジグラフとオントロジー
ナレッジグラフとオントロジー
 
Azure OpenAI ServiceのChatGPT API と OpenAIのChatGPT APIの比較
Azure OpenAI ServiceのChatGPT API と OpenAIのChatGPT APIの比較Azure OpenAI ServiceのChatGPT API と OpenAIのChatGPT APIの比較
Azure OpenAI ServiceのChatGPT API と OpenAIのChatGPT APIの比較
 
明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリア
明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリア明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリア
明治大学 データサイエンス・AIに関するオムニバス授業 エバンジェリストというキャリア
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと
 
心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話心理的安全性を 0から80ぐらいに上げた話
心理的安全性を 0から80ぐらいに上げた話
 
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメント
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメントDX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメント
DX時代のITエンジニアに送る、アジャイル式「いきいき」ヘルスマネジメント
 
Aws amplify studioが変えるフロントエンド開発の未来とは v2
Aws amplify studioが変えるフロントエンド開発の未来とは v2Aws amplify studioが変えるフロントエンド開発の未来とは v2
Aws amplify studioが変えるフロントエンド開発の未来とは v2
 
[DO13] 楽天のクラウドストレージ使いこなし術 Azure と OSS で少しずつ進めるレガシー脱却
[DO13] 楽天のクラウドストレージ使いこなし術 Azure と OSS で少しずつ進めるレガシー脱却[DO13] 楽天のクラウドストレージ使いこなし術 Azure と OSS で少しずつ進めるレガシー脱却
[DO13] 楽天のクラウドストレージ使いこなし術 Azure と OSS で少しずつ進めるレガシー脱却
 
ヤフーのプライベートクラウドとクラウドエンジニアの業務について
ヤフーのプライベートクラウドとクラウドエンジニアの業務についてヤフーのプライベートクラウドとクラウドエンジニアの業務について
ヤフーのプライベートクラウドとクラウドエンジニアの業務について
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
 
ReDosトラック内発表資料
ReDosトラック内発表資料ReDosトラック内発表資料
ReDosトラック内発表資料
 
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
 
Web開発者が始める .NET MAUI Blazor App
Web開発者が始める .NET MAUI Blazor AppWeb開発者が始める .NET MAUI Blazor App
Web開発者が始める .NET MAUI Blazor App
 
SNS運用代行サービス提案書
SNS運用代行サービス提案書SNS運用代行サービス提案書
SNS運用代行サービス提案書
 
グラフモデルとSoEとGraphQL データ指向アプリケーションデザインから見るGraphQL
グラフモデルとSoEとGraphQL データ指向アプリケーションデザインから見るGraphQLグラフモデルとSoEとGraphQL データ指向アプリケーションデザインから見るGraphQL
グラフモデルとSoEとGraphQL データ指向アプリケーションデザインから見るGraphQL
 
.NET Core時代のCI/CD
.NET Core時代のCI/CD.NET Core時代のCI/CD
.NET Core時代のCI/CD
 

Semelhante a RubyのDir、File、IO について

running-elixir-in-production
running-elixir-in-productionrunning-elixir-in-production
running-elixir-in-productionTsunenori Oohara
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Koji SHIMADA
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringMakoto Ohnami
 
20101106 ramaze発表
20101106 ramaze発表20101106 ramaze発表
20101106 ramaze発表Fukui Osamu
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてTomoya Kawanishi
 
Data processing at spotify using scio
Data processing at spotify using scioData processing at spotify using scio
Data processing at spotify using scioJulien Tournay
 
PlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.keyPlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.key泰 増田
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRubyemasaka
 
Perl/CGI 入門
Perl/CGI 入門Perl/CGI 入門
Perl/CGI 入門keroyonn
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能についてTomoya Kawanishi
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
Sinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶSinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶHiroshi Oyamada
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
丸山先生レクチャーシリーズ2007-2008
丸山先生レクチャーシリーズ2007-2008丸山先生レクチャーシリーズ2007-2008
丸山先生レクチャーシリーズ2007-2008Yoichiro Tanaka
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」Hiro H.
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力ThinReports
 

Semelhante a RubyのDir、File、IO について (20)

running-elixir-in-production
running-elixir-in-productionrunning-elixir-in-production
running-elixir-in-production
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4
 
Redis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo SpringRedis Intro Osc2010 Tokyo Spring
Redis Intro Osc2010 Tokyo Spring
 
20101106 ramaze発表
20101106 ramaze発表20101106 ramaze発表
20101106 ramaze発表
 
Ruby の制御構造とリテラルについて
Ruby の制御構造とリテラルについてRuby の制御構造とリテラルについて
Ruby の制御構造とリテラルについて
 
Rake
RakeRake
Rake
 
Data processing at spotify using scio
Data processing at spotify using scioData processing at spotify using scio
Data processing at spotify using scio
 
PlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.keyPlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.key
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
Perl/CGI 入門
Perl/CGI 入門Perl/CGI 入門
Perl/CGI 入門
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能について
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
Haikara
HaikaraHaikara
Haikara
 
Sinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶSinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶ
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
丸山先生レクチャーシリーズ2007-2008
丸山先生レクチャーシリーズ2007-2008丸山先生レクチャーシリーズ2007-2008
丸山先生レクチャーシリーズ2007-2008
 
Application Bootstrap
Application BootstrapApplication Bootstrap
Application Bootstrap
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
CLR/H 第56回勉強会 LT「Ruby向けmultisetライブラリのご紹介」
 
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
Ruby向け帳票ソリューション「ThinReports」の開発で知るOSSの威力
 

Mais de Tomoya Kawanishi

ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例Tomoya Kawanishi
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウTomoya Kawanishi
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列についてTomoya Kawanishi
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されることTomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現についてTomoya Kawanishi
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについてTomoya Kawanishi
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選Tomoya Kawanishi
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと WebクローリングについてTomoya Kawanishi
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interfaceTomoya Kawanishi
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーTomoya Kawanishi
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介Tomoya Kawanishi
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについてTomoya Kawanishi
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Tomoya Kawanishi
 
マークアップで使えるRuby
マークアップで使えるRubyマークアップで使えるRuby
マークアップで使えるRubyTomoya Kawanishi
 
エネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてエネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてTomoya Kawanishi
 
AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてTomoya Kawanishi
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発についてTomoya Kawanishi
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決についてTomoya Kawanishi
 

Mais de Tomoya Kawanishi (20)

英単語の覚え方
英単語の覚え方英単語の覚え方
英単語の覚え方
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウ
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列について
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されること
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現について
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについて
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと Webクローリングについて
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interface
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介
 
Ruby の String のメソッドについて
Ruby の String のメソッドについてRuby の String のメソッドについて
Ruby の String のメソッドについて
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
 
マークアップで使えるRuby
マークアップで使えるRubyマークアップで使えるRuby
マークアップで使えるRuby
 
エネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてエネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例について
 
AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分について
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発について
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決について
 

Último

UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 

Último (9)

UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 

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