プロが教える店舗&オフィスのセキュリティ対策術

http://www.ne.jp/asahi/oh/landd/prog_html/prog23 …

上記のサイトに

 strcat( dir_cpy, "\\*" );
 search = FindFirstFile( dir_cpy, &finddata );
 if( search != INVALID_HANDLE_VALUE ){

  // 現在のディレクトリ(フォルダ)と親ディレクトリは排除
  if( strcmp( finddata.cFileName, ".." ) != 0 && strcmp( finddata.cFileName, "." ) != 0 ){
   ………
  }

  while( FindNextFile( search, &finddata ) != 0 ){

このような意味のソースが有りますが、コメントの行位置では
finddata.cFileName が "." 以外になったことがありません。
そのため、いつも if は偽で、 ……… の部分が実行されません。
どういう場合に ……… の部分の処理がされるんですか?

A 回答 (2件)

>strcmp( finddata.cFileName, ".." )


>が偽になるのはどういう場合ですか?
FindFirstFile()で「..」という親ディレクトリが見つかった場合です。
が、通常、「.」というカレントディレクトリが先に見つかりますので
おこらないはずです。
しかし、プログラムの基本としては、起こりうる可能性があれば記述して
おいた方が安全なのでそのようにします。

「.」や「..」はディレクトリなので、この判定がなければ、次の「………」に
処理が移ります。このとき、ディレクトリの場合は SearchDirFile()を再帰的に
呼び出しますので、「.」や「..」がこの処理にかかると無限ループに入って
しまい致命的な問題となります。どんなことがあっても「.」や「..」の場合は
「………」の処理に入ってはいけないのです。

プログラミングにおいては、起こりうる可能性がある全ての場合に対して
安全に動作するように考慮すべきです。安易に「こうなるはずだ」と思って
特定の条件を省略するとバグの元になりますので注意した方がいいと思います。
    • good
    • 0
この回答へのお礼

安全を考慮するとそうですね。
でもやっぱりそれは通常は起こらず、どのように試しても
それになるのを確認することはできませんでした。
ありがとうございました。

お礼日時:2003/05/02 23:03

この処理は、指定のディレクトリで最初に見つかったファイル(orディレクトリ)の


判定部分ですよね。(2番目以降は、下の「次のファイルの検索」です)
通常サブディレクトリには、カレントディレクトリを現す「.]という
ディレクトリが最初にありますのでそういう結果になっているんですね。
唯一違うのは、ルートディレクトリ(C:\など)の場合です。

MS-DOS(コマンド)プロンプトで、
 DIR C:\WINDOWS|MORE

 DIR C:\|MORE
の両方をやってみると雰囲気がわかるかもしれません。

この回答への補足

ルートを指定したら、……… の部分の処理がされました。
詳しく調べてみると、それは finddata.cFileName が
ルートに有るファイル名だった場合でした。
コメントの行位置で、finddata.cFileName が
ファイル名になる場合と "." になる場合を確認できました。
ifのもう1つの条件の
strcmp( finddata.cFileName, ".." )
が偽になるのはどういう場合ですか?
他のURLで、このように while( FindNextFile の手前で
strcmp( finddata.cFileName, ".." )

strcmp( finddata.cFileName, "." )
の2つの条件を調べているソースが有ればURLを教えてください。

補足日時:2003/04/29 02:45
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!