- ベストアンサー
DIR関数について教えてください。
現在、テキストボックスに入力した文字が、テキストファイル等の中身に存在するかを調べるプログラムの問題を解いているのですが。 選択したフォルダの下の階層にある全てのフォルダに対しても 検索を行うプログラミングでかなり悩んでいます。 特に、Dir関数の意味が???です。 例えば現在のパスをC:\テスト01\テスト02\としたときに、 変数Mypathに Mypath=C:\テスト01\テスト02\と代入して、 変数MyNameに MyName = Dir(setPath & "*.*", vbDirectory)とすると 変数MyNameには、1回目は"."が入り、2日目は".."が入ります。 なぜ、"."や".."が入るのか分からず悩んでいます。 "."は、現在のフォルダを表して、".."は親(1つ上)のフォルダを表していると、 と言うことは、ヘルプを調べて分かったのですが。 なぜ?こういった値が入るのか理解できない状態です。 3回目は、まともなファイル名が(例えばtest.txt)などのちゃんとした ファイル名が入ってくれるのですが。 特に、".."(親フォルダ)をなぜ見に行くのか??よく分かっていません。 良かったら教えてください。 よろしくお願いします。m(__)m
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
私も少なからずはよく理解は出来てないですが、イメージとしてとらえてください。 (イメージしてください。) 地上1階・地下1階・地下2階の家があるとします。 各階は、階段によって繋がっています。 地上1階には、地下1階に下りる階段があります。 地下1階には、地上1階に上る階段と地下2回に下りる階段があります。 地下2階には、地下1階に上る階段があります。 地下1階・地下2階を見てもらうとわかると思いますが上に上る階段が有りますよね。 これが、「..」に当たるわけです。 それと、今自分がどこにいるのかを知る為のものとして「.」があるわけです。 地下2階に行く為には、必ずこの家の地上1階からしか入れないわけです。 この地下2階はどの家の地上1階・地下1階と繋がっているか? と言うものとしてあるわけです。 「.」も「..」もない場合は、地上1階に居ると言う事です。 「..」が無いと言う事は、地上1階にいるのがわかっているので「.」は無くても良いのです。 地上1階 … C:\ 地下1階 … C:\テスト01\ 地下2階 … C:\テスト01\テスト02\ と言う風に、表現してみました。如何でしょうか。 イメージをとららえることが出来れば、幸いです。
その他の回答 (3)
恐らく、目的とされている 「選択したフォルダの下の階層にある全てのフォルダに対して」 の動作は大丈夫な上で、どうして?と悩んでおられると思います。 フロッピーディスクや、ハードディスク、そのものには 「階層的なディレクトリ構造」 を実現する手段を備えていません。 もちろん、ファイルシステムに依存しますが、 「階層構造を実現するための特殊ファイル」 として「. や ..」が導入されたのだと考えて下さい。 それらは FAT エントリ他ディレクトリ構造を実現するための情報を持った、 あくまでも通常のファイルと同じようなファイルですので、 Dir 関数で拾えてしまっても仕方がないのです。 そこで、ヘルプにあるように 「ファイル名が . や .. だったら処理を飛ばす」 ことでこの特殊なファイルをパスしているだけです。 お気づきのようにルートの処理はまた別なのですが、 もしとことん突き詰めようと思われるなら、 FAT MS-DOS ファイルシステム などのキーワードで検索してみて下さい。 頑張って下さいね(^^;。
お礼
x89さん、お返事ありがとうございます。 皆さんのおかげさまで、納得いきました。 頭の中がすっきりした状態になりました。(^_^) また、ルートについても時間があるとき調べて見たいと思います。 情報、ありがとうございまいた。m(__)m
- imogasi
- ベストアンサー率27% (4737/17069)
下記テストプログラムを実行して感じを掴んでください。 Sub Sample() Dim FName As String FName = Dir("C:\My Documents\HTMLプロ") Debug.Print FName End Sub Dirのカッコ内を次に変えてテストしてみてください。 (1)DIR()としたとき、エラー (2)()内に”C:"としたとき (3)()内に”C:¥”としたとき (4)()内に”c:\My Documents”としたとき (5)()内に”c:\My Documents\"としたとき (6)()内に"c:\My Documents\YY"としたとき 「YY」は自分のコンピュターでc:\My Documents\の中 に存在する1つのフォルダ名を入れる。 -------------------- Sub Sample() Dim FName As String FName = Dir("c:\My Documents\") Do While FName <> "" Debug.Print FName FName = Dir() Loop End Sub Dirのカッコ内を次に変えてテストしてみてください. (1)DIR()としたとき、エラー (2)()内に"C:"としたとき (3)()内に"C:¥"としたとき (4)()内に"c:\My Documents"としたとき (5)()内に"c:\My Documents\"としたとき (6)()内に"c:\My Documents\YY"としたとき 「YY」は自分のコンピュターでc:\My Documents\の中 に存在する1つのフォルダ名を入れる。 結局Dir(X)はそのフォルダ(X)内のファイル名を取得する。 なければ""を返す。終わりであれば""を返す(なければの一種)。 Dir()で直前に指定しているフォルダの直前に指していたファイルの次のファイル名を取ってくる。 最初だけはDir()は「直前に指定しているフォルダ」がないので、エラーになる。 こう言うことでしょうか。 さてお尋ねの「.」「..」の件ですが、DOS時代のDir やCDならさておき、経験したことがないのですが、上記 テストプログラムで()内に入れてやって見てそうなるか 試してください。vbDirectoryが関係しているかもしれない。上記のテストプログラムはAttributeをりゃくしているので、vbNormal(標準ファイル)のケースです。 >「変数Mypathに Mypath=C:\テスト01\テスト02\と代入して、 変数MyNameに MyName = Dir(setPath & "*.*", vbDirectory)とすると 」とあるがMypathとsetPathの関係は?
お礼
お返事ありがとうございます。m(__)m そして、訂正です。m(__)m setPathは、MyPathでした。すいません。 上記のサンプルありがとうございました。m(__)m 試させてもらいました。 結局Dir(X)はそのフォルダ(X)内のファイル名を取得する。 なければ""を返す。終わりであれば""を返す(なければの一種)。 と言うのは、あやふやに理解していたのですが、 imogasiさんの説明のおかげで理解×2です。 でもやっぱり、"."や".."がWhat?って感じです。 Dir関数のパスを「C:\」とか「D:\」とかルートディレクトリにすると "."や".."は返ってこなくなるのですが。 「C:\テスト\」見たく、ドライブ名にフォルダを付けると返って来ます。 imogasiさんのサンプルでも確認させてもらいました。 う~ん、なぜなんだろう? こうなると、覚えた方がいいのでしょうか?
MS-DOS のファイルシステム上、ディレクトリも単なるファイルです。 "." や ".." という特別なファイルを用いて階層的なディレクトリ構造を実現しています。 従って、Dir 関数でこれらが返ってくるのは当然の動作です。 お手元に VB のヘルプ(MSDN 等)があれば、 「Dir 関数の使用例」 というのを参照してみて下さい。 例の最後にある処理が参考になると思います。
お礼
お返事ありがとうございます。 せっかくアドバイス頂いたのですが、やっぱり、What?って感じです。 頭が固い状態で申し訳ないです。m(__)m 現在のフォルダ(カレントフォルダ)より下のフォルダが、 返ってくるのは分かるのですが。 どうしても、親フォルダやカレントフォルダが、なぜ返ってくるのかが、 分からない状態です。 ヘルプは、すでに同じ場所を見て、色々フォルダを変更しながらDebugを 試したのですが・・・やっぱり分からず Dir関数のパスを「C:\」とか「D:\」とかルートディレクトリにすると "."や".."は返ってこなくなるのですが。 「C:\テスト\」見たく、ドライブ名にフォルダを付けると返って来ます。 ヘルプのコード ******************************************************** ' 現在のフォルダと親フォルダは無視します。 ' If Myname <> "." And Myname <> ".." Then ******************************************************** は、コメントにして試しています。 やっぱり?って考えてしまいます。(^_^;)
お礼
BlueRayさん、とても分かりやすい説明ありがとうございました。m(__)m おかげさまで、なっとくできました。 地下に例える説明、気に入ってしまいました。(^_^) 現在、自分が居る位置を知るためのものと、 考えればとても、分かりやすいです。 また、地上1階では、".."や"."見たいな方位時針見たい物は要らないですよね。 本当に、分かりやすい説明ありがとうございました。 感謝です!!m(__)m ありがとうございました。m(__)m