SlideShare une entreprise Scribd logo
1  sur  20
Télécharger pour lire hors ligne
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
ご清聴ありがとう
ございました

Contenu connexe

Tendances

PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話y-uti
 
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティElasticsearch
 
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜Teppei Sato
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門泰 増田
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―shinjiigarashi
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティスAmazon Web Services Japan
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。sasezaki
 
Spring Boot + Netflix Eureka
Spring Boot + Netflix EurekaSpring Boot + Netflix Eureka
Spring Boot + Netflix Eureka心 谷本
 
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05都元ダイスケ Miyamoto
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書くmametter
 
第二回CTF勉強会資料
第二回CTF勉強会資料第二回CTF勉強会資料
第二回CTF勉強会資料Asuka Nakajima
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法についてYuji Otani
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方Shohei Koyama
 
Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるRuby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるmametter
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCdisc99_
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」Takuto Wada
 

Tendances (20)

PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
ログ+メトリック+トレースの組み合わせで構築する一元的なオブザーバビリティ
 
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜Node.js Native ESM への道  〜最終章: Babel / TypeScript Modules との闘い〜
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
OAuth 2.0のResource Serverの作り方
OAuth 2.0のResource Serverの作り方OAuth 2.0のResource Serverの作り方
OAuth 2.0のResource Serverの作り方
 
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
 
Spring Boot + Netflix Eureka
Spring Boot + Netflix EurekaSpring Boot + Netflix Eureka
Spring Boot + Netflix Eureka
 
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
AWSにおけるバッチ処理の ベストプラクティス - Developers.IO Meetup 05
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書く
 
第二回CTF勉強会資料
第二回CTF勉強会資料第二回CTF勉強会資料
第二回CTF勉強会資料
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるRuby 3のキーワード引数について考える
Ruby 3のキーワード引数について考える
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
マイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPCマイクロサービスバックエンドAPIのためのRESTとgRPC
マイクロサービスバックエンドAPIのためのRESTとgRPC
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 

Similaire à 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 での外部コマンドの実行について
Ruby での外部コマンドの実行についてTomoya Kawanishi
 
メタメタプログラミング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
 
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
 

Similaire à 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 での外部コマンドの実行について
 
メタメタプログラミング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
 
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の威力
 

Plus 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 on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について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
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと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
 

Plus de Tomoya Kawanishi (20)

英単語の覚え方
英単語の覚え方英単語の覚え方
英単語の覚え方
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウ
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列について
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されること
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現について
 
Ruby のワンライナーについて
Ruby のワンライナーについてRuby のワンライナーについて
Ruby のワンライナーについて
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと
 
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コストの事業部別コスト配分について
 

Dernier

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 

Dernier (10)

知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

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