鍋あり谷あり

テーマを決めずに適当に書いています。

ドライブが使えるかどうか調べるの続きの続き

先日 ( 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?)」でも今回の目的には十分です。でもやっぱりそれはそれで違う話のような気も。

#写真と本文は関係ありません。