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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) VBAで実行時エラー'424' オブジェクトが必要ですと出る 2 2022/10/07 09:25
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CFileDialogの最初のディレクト...
-
rmdirでフォルダが消せません
-
Subversionのリポジトリの削除
-
[ ディレクトリ '.' は書き込み...
-
レンタルサーバーでPDF出力
-
fopenでファイルが開かない場合...
-
環境変数をMakefile内で有効に...
-
CygwinでNo such file
-
FTPコマンドでディレクトリごと...
-
PHPで新しいウインドウで開く命...
-
onedrive にexcelファイルをア...
-
PHP8を使うと、大量のWarningが...
-
PHPで特定のURLにジャンプす...
-
PHP4対応のサーバーではinclude...
-
imagejpegで表示されない。
-
VBAのコードを教えてください
-
これの対応OSを教えて下さい。p...
-
透過PNGが透過されない!!
-
手作業で埋め込んだ、UserForm1...
-
拡張子php画像をjpg画像等に変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FTPコマンドでディレクトリごと...
-
バッチを用いたフォルダの自動移動
-
CFileDialogの最初のディレクト...
-
現在位置より2つ上のディレク...
-
Subversionのリポジトリの削除
-
fopenでファイルが開かない場合...
-
makefile でファイルをコピーす...
-
VB.NET 最下位のディレクトリ名...
-
rmdirでフォルダが消せません
-
visualstudioでc#のdllができない
-
ファイルアップロードに関して...
-
絶対パス?絶対アドレス?意味...
-
MkDir関数
-
拡張子を隠すのは良い事なので...
-
Subversionで、ファイルをリネ...
-
powershell で書いたプログラム...
-
コマンドプロンプトを指定のデ...
-
ファイル選択ダイアログで選択...
-
aspのページが表示できません
-
JAVA内で複数のファイルを削除...
おすすめ情報