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 は偽で、 ……… の部分が実行されません。
どういう場合に ……… の部分の処理がされるんですか?
No.2ベストアンサー
- 回答日時:
>strcmp( finddata.cFileName, ".." )
>が偽になるのはどういう場合ですか?
FindFirstFile()で「..」という親ディレクトリが見つかった場合です。
が、通常、「.」というカレントディレクトリが先に見つかりますので
おこらないはずです。
しかし、プログラムの基本としては、起こりうる可能性があれば記述して
おいた方が安全なのでそのようにします。
「.」や「..」はディレクトリなので、この判定がなければ、次の「………」に
処理が移ります。このとき、ディレクトリの場合は SearchDirFile()を再帰的に
呼び出しますので、「.」や「..」がこの処理にかかると無限ループに入って
しまい致命的な問題となります。どんなことがあっても「.」や「..」の場合は
「………」の処理に入ってはいけないのです。
プログラミングにおいては、起こりうる可能性がある全ての場合に対して
安全に動作するように考慮すべきです。安易に「こうなるはずだ」と思って
特定の条件を省略するとバグの元になりますので注意した方がいいと思います。
安全を考慮するとそうですね。
でもやっぱりそれは通常は起こらず、どのように試しても
それになるのを確認することはできませんでした。
ありがとうございました。
No.1
- 回答日時:
この処理は、指定のディレクトリで最初に見つかったファイル(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を教えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FTPコマンドでディレクトリごと...
-
バッチを用いたフォルダの自動移動
-
Subversionのリポジトリの削除
-
CFileDialogの最初のディレクト...
-
makefile でファイルをコピーす...
-
[ ディレクトリ '.' は書き込み...
-
LoadLibraryの戻り値(HMODULE)...
-
MkDir関数
-
ディストリビューションウィザ...
-
絶対パス?絶対アドレス?意味...
-
IIS仮想ディレクトリでのみPHP...
-
VB.NETでディレクトリの一覧を...
-
Rubyのスクリプト
-
チーム開発のデバッグ方法について
-
PHPにおいてJAVAのWEB-INFに対...
-
powershell で書いたプログラム...
-
includeが出来ない訳とは?
-
phpのftp_putについて
-
SHELLでFTP転送
-
VB2008でFTPでのディ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチを用いたフォルダの自動移動
-
FTPコマンドでディレクトリごと...
-
Subversionのリポジトリの削除
-
CFileDialogの最初のディレクト...
-
makefile でファイルをコピーす...
-
絶対パス?絶対アドレス?意味...
-
コマンドプロンプトを指定のデ...
-
VB.NET 最下位のディレクトリ名...
-
現在位置より2つ上のディレク...
-
Visual C++ 2005 Express Editi...
-
fopenでファイルが開かない場合...
-
renameでのPermission deniedエ...
-
MkDir関数
-
[ ディレクトリ '.' は書き込み...
-
visualstudioでc#のdllができない
-
powershell で書いたプログラム...
-
UWSCでファイルのアップロード...
-
DLL のロードの順序
-
JAVA内で複数のファイルを削除...
-
VB2008でFTPでのディ...
おすすめ情報