&tag(Ruby, ファイル); *目次 [#ve4f3336] #contents *参考情報 [#a976c8aa] -[[Ruby]] *エンコーディング [#i1984b49] **BOM付きUTF-8ファイルを書き出す [#i9f1f0fa] -手作業でやるしかない? #pre{{ def write_bom(fp) data = " " data.setbyte(0, 0xEF) data.setbyte(1, 0xBB) data.setbyte(2, 0xBF) fp.write(data) end }} *ファイルを削除する [#v4efa279] **FileUtils.rmを使う [#cb4da459] ***ファイルを一つだけ削除 [#ha3bffa3] FileUtils.rm("d:/temp/foo.txt") *** ワイルドカードにマッチするファイルを削除 [#ce50d17a] FileUtils.rm(Dir.glob("d:/temp/*.jpg")) *パスの操作 [#j3f25b5a] **File.expand_pathの第2引数について [#b1dfed6c] -[[RubyのFile.expand_path('相対パス', __FILE__)の意味 - maeharinの日記:http://d.hatena.ne.jp/maeharin/20130104/p1]]。 -File.expand_path('./lib', __FILE__)とすると、"〜a.rb/lib"のように展開される。これはexpand_pathが第二引数がファイル名であろうとそのまま基準ディレクトリとして扱うため。 -ファイル名部分を打ち消すためは、File.expand_path('../lib', __FILE__)とする。 -応用として、testディレクトリにあるテストファイルから、親ディレクトリにある本番rubyスクリプトをrequireするとき次のようにすればよい。"../"の一つは上記のうちけしでつかわれるので二重になっている。 require File.expand_path('../../a.rb', __FILE__) **Pathname [#aff82616] -pathを操作するための専用クラス。 #pre{{ require 'pathname' path = Pathname.new("/tmp") path += 'sample.txt' #結合できる。戻り値はPathnameオブジェクト p path # => #<Pathname:/tmp/sample.txt> }} *Zipファイルの取り扱い [#w58868c9] ** Rubyzipを使用する [#g3416bf2] .zipファイルを圧縮解凍するためのライブラリ。 ***Rubyzipで解凍する [#i11a99aa] -指定したzipファイルをtmpフォルダ以下に解凍するサンプル #pre{{ Zip::File.open('data/demo.zip') do |zipfile| zipfile.each do |entry| puts "extracting #{entry.name}" entry.extract('tmp/' + entry.name) end end }} *トラブルシューティング [#ed06a0ca] **ファイルに出力すると^Mが表示される。 [#a3f30012] -[[^M (ハットM)記号について - Fakin'it:http://fakinit.xrea.jp/fakinit/2009/07/m-m.html]]に書いてあるように、^MはCR(=\r)に相当することを前提として、例えば次ぎのようなプログラムをWindows環境で動かす。 #pre{{ f = File.open("log.txt", "w") f.print("abc\r\n") f.close }} -するとlog.txtには次のような文字が書き出される(しかもエディタで見るとcrlfモード)。 abc^M -これはファイルをテキストモードで書き出しオープン(="w")しているため。\nが\r\nに変換されて書き出されるため、結局ファイルには"abc\r\r\n"が書き出されていることになる。末尾の\r\nがcrlfモードとしてエディタに認識され、残った\rが^Mとして画面に表示されることになる。