Dir関数はバグ持ち?

解決


  2007-02-18 02:27:23  No: 98053

コーディングをしていて気になったんですが、Dir関数ってバグありません?
例えば、
Dir("C:\*新規*フォルダ*", vbDirectory)
のようにCドライブに新規とフォルダの二つの文字を含むフォルダを取得しようとしたのですが、
C:\*新規*フォルダの後に"*"と記述するとvbDirectoryを指定しているにもかかわらず、新規とフォルダの文字を含むファイルを取得します。
さらにC:\*新規*フォルダの後に"*"を書かないと、目的のフォルダを取得できますが、
新規フォルダ1のようにファイルの後ろに文字が書かれているフォルダは取得できません。

環境はVisual Basic6.0です。
乱文失礼しました。


魔界の仮面弁士  2007-02-18 03:38:10  No: 98054

> 新規とフォルダの文字を含むファイルを取得します。
第二引数は、「その属性を持つ項目を含める」というフラグ指定です。

vbReadOnly を渡したからといって、読込専用のファイルだけが列挙されるわけではありませんし、
vbDirectory を渡したからといって、ディレクトリ属性を持ったファイル(≒フォルダ)のみが
得られるわけでもありません。(VB6以前の、16bit時代のVBもそうでした)

少なくとも、ヘルプの「Dir 関数の使用例」では、受け取った内容が
フォルダかどうかを、GetAttr で追試するコードが書かれているわけですから、
この点に関しては、バグ(仕様と異なる動作をするコード)ではなく、
最初からそういう仕様の関数であるとみるべきかと。

# というよりも、FindFirstFile API の仕様と同じである、ということで。
# C++ とかでも、FindFirstFile した後に GetFileAttributes で判定しますし。

まぁ、Dir 関数に問題があるとすれば、
  Macintosh 環境で利用したときに、第1引数のワイルドカードを使えない
とか、
  Windows 環境で、第2引数に圧縮属性(&H2000)や暗号化属性(&H4000)を指定できない
という点などをあげる事ができますが、これもバグというよりは、機能的な制限でしょうし。

> さらにC:\*新規*フォルダの後に"*"を書かないと、目的のフォルダを取得できますが、
> 新規フォルダ1のようにファイルの後ろに文字が書かれているフォルダは取得できません。
何が問題になっているのか、状況を理解しきれていないのですが、
少なくとも当方の環境では、
  C:\新規フォルダ
  C:\新規フォルダ1
という 2 つのディレクトリを作成した上で、Dir 関数を呼び出したところ、
"C:\*新規*フォルダ*" を指定した場合は、両フォルダが列挙でき、
"C:\*新規*フォルダ" を指定した場合は、前者のみが返されましたから、
期待通りの結果になっているような気がします。


  2007-03-03 07:33:17  No: 98055

なるほど、自分は第二引数をディレクトリで指定したら
フォルダ情報のみを取得してくると思っていたので、

デバッグ時にファイルが取れてきた時点でバグだと思い、
それ以降のデータを見ていませんでした。
試してみたらその後にフォルダが取れていました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加