先日 ( d:id:Nabetani:20060104:p4 ) の続き(d:id:Nabetani:20060107:p1)の続き。
コメントありがとうございます。>なかだ様
で。
早速 ruby を 「ruby 1.8.4 (2005-12-24) [i386-mswin32]」にアップデートして、「File.directory?( 'A:' )」を試してみました。
すると。確かに戻ってくる値は false になってました。
しかし。
d:id:Nabetani:20060107:p1 に書いたのと同じメッセージボックスは相変わらず表示されます。それも、二度も。私が欲しいのは(先日ははっきり書きませんでしたが)メディアが刺さってないドライブを調べたら黙って false を返すメソッドなので、File.directory? はちょっと使えません。
で。
折角なので、FindFirstFile を呼んだらどうなるのか調べてみました:
require 'Win32API' FindFirstFile = Win32API.new( 'Kernel32.dll', 'FindFirstFileA', 'pp', 'n' ) FindClose = Win32API.new( 'Kernel32.dll', 'FindClose', 'n', 'n' ) def findfirstfile( path ) if /^([a-z]+\:)/i===path s = '\0'*4096 args = [ #HANDLE FindFirstFile( $1+'\\*.*', # LPCTSTR lpFileName, // ファイル名 s # 'LPWIN32_FIND_DATA lpFindFileData // データバッファ ] handle = FindFirstFile.call( *args ) r = -1 != handle FindClose.call( handle ) if r r else raise "bad path <#{path}> in FileTest.drive_ready?" end end p findfirstfile( 'A:' )
すると。やっぱりメッセージボックスが表示されるので、なんかそういう仕様なんでしょう。
というわけで、先日書いた FileTest.drive_ready? よりもよい案は今のところないようです。
……と言いたいところですが。
「!(`dir a:`.empty?)」でも今回の目的には十分です。でもやっぱりそれはそれで違う話のような気も。
#写真と本文は関係ありません。