難しい検索をするソリューション
- Elasticsearch.org ( 新しい。おすすめらしい )
- Apache Solr ( Elasticsearch がなかった時は これが主流だった )
File
size?
File.size?("no such file") #=> nil
File.size?("zero_size_file") #=> nil
File.size?("one_byte_file") #=> 1
size? は、サイズがゼロだと 0
ではなく nil
を返す。
意外。
size? と zero? と exist?
size? | zero? | exist? | |
---|---|---|---|
サイズ1のファイル | 1 | false | true |
サイズ0のファイル | nil | true | true |
リンク切れのsymlink | nil | false | false |
存在しないファイル | nil | false | false |
アクセス権のないファイル | nil | false | false |
存在しても、アクセス権がないと exist?
は false
になる。
実装する人の気持ちになればあたりまえだけど、意外かもしれない。
あと、リンク切れのシンボリックリンクの exist?
が false
になるので、 Dir.glob
で得られたファイル名だからといって、 exist?
が true
とは限らない。要注意かも。
TODO ( あるいは、緩募 ): Windows で、実在しないドライブとか、実在するけどメディアがささっていないドライブでの動作
cmp
File.cmp( "some_file", "another_file" ) #=> true / false
私としては、true/false を返すなら、 cmp ではなくで same? のような名前がいいなぁ。
cmp は <=>
のような動作をする気がしてしまう。
link
Mac でも、普通のSDカード上とかでやると、ハードリンクは作れない。エラーになる。
File.link( "hoge", "fuga" ) #=> Errno::ENOTSUP: Operation not supported @ sys_fail2 - (hoge, fuga)
あと。
http://www.atmarkit.co.jp/ait/articles/1306/07/news111.html
によると、Vista 以降にはシンボリックリンクがあるらしい。
まだ試していない。
※ SDカードのファイルシステムは、"exFAT"( http://ja.wikipedia.org/wiki/ExFAT ) らしい。
stat と inspect
pry 上で
File.stat( "/" )
すると、 mode
、 uid
や gid
の辺りに
mode=040755 (directory rwxr-xr-x),
nlink=34,
uid=0 (root),
gid=0 (wheel),
という具合に便利な情報が出る。
これは pp
の機能。競合の ap
(awesome_print) にはこの機能はない。
FileUtils
mkdir_p
mkdir_p の p ってなんだ、という話になって。
調べてないけど Parent の p かなぁということで落ち着いた。
mkdir_p
と mkpath
は同じメソッドの別名なんだけど、
pry で $ FileUtils#mkpath
すると、 mkdir_p
が出るので、真の名は mkdir_p らしい。
いろいろなデバイス
キャラクタデバイスの例としては、 /dev/urandom
を挙げた。
ブロックデバイスの例としては /dev/disk0
を挙げた。
File.pip?( path )
と File.socket?( path )
が true になるような例は挙げられなかった。
ファイルの同一性
Windows には SUBST と JOIN ( http://en.wikipedia.org/wiki/SUBST )があり、その上 short file name ( 「PROGRA~1」のたぐい)もあるので、パスの比較でファイルの同一性を判断するのは得策じゃないと思う。
じゃあどうするかというとやっぱり GetFileInformationByHandle
にいくしかないんじゃないかなぁ。
とはいえ、試してない。