MessageBoxが表示されないのは何で
- ファイル名から特定の文字列を除外する際に、MessageBoxが表示されない原因を知りたいです。
- 以下のコーディングでは、メッセージボックスが表示されず、原因を特定できません。
- ご教授いただければと思います。
- ベストアンサー
MessageBoxが表示されないのは何で
以下の様なコーディングではメッセージボックスが表示されません。 最終的にやりたいことは、ディレクトリー検索で取得したファイル名(w32fd.cFileName)から"."または".."を除外したいのですが・・・。 char a1[] = ".\0"; char a2[] = "..\0"; hfind = FindFirstFile ( (LPCTSTR)buf , &w32fd ) ; if ( hfind != INVALID_HANDLE_VALUE ){ do { if (w32fd.cFileName == a1 || w32fd.cFileName == a2){ MessageBox ( NULL, "STOP", "STOP", MB_OK ); } ~略~ } while ( FindNextFile ( hfind, &w32fd ) ) ; お手数ですがご教授お願いします。
- dido123
- お礼率57% (23/40)
- C・C++・C#
- 回答数3
- ありがとう数1
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> if (w32fd.cFileName == a1 || w32fd.cFileName == a2){ 処理系が分かりませんが、文字列の比較ってこれで出来ましたか。 一般的に文字列の比較はstrcmpなどを使用しませんか。
その他の回答 (2)
- edomin7777
- ベストアンサー率40% (711/1750)
#1です。 もしかして私が勘違いしてた…。w 比較するものの型が違うよね?
補足
WIN32_FIND_DATA w32fd ; HANDLE hfind ; char buf[MAX_PATH] = "C:\\Data\\*"; でFindFirstFileを使用すると必ずファイルが無くても "."と".."がでてきます。 型はWIN32_FIND_DATA typedef struct _WIN32_FIND_DATAA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; CHAR cFileName[ MAX_PATH ]; CHAR cAlternateFileName[ 14 ]; #ifdef _MAC DWORD dwFileType; DWORD dwCreatorType; WORD wFinderFlags; #endif } WIN32_FIND_DATAA; なので問題ないと思っているのですが・・・。
- edomin7777
- ベストアンサー率40% (711/1750)
「以下の様なコーディングではメッセージボックスが表示されません。」 そりゃ、そうだ…。 「w32fd.cFileName == a1 || w32fd.cFileName == a2」 ファイル名が「.」や「..」だけなら、動くんだろうけど。 find()とか使えば、文字列の中も検索できそうです。 組み直しましょう。 そのときは、「\0」は要らないような気がする…。
関連するQ&A
- C言語
*.cファイルを検索するんですがmain.cのファイルだけを検索しないようにするにはどう付け加えればいいでしょうか? void DoFind() { HANDLE hFind; WIN32_FIND_DATA fd; FILETIME ft; SYSTEMTIME st; /* 最初のファイル検索 */ hFind = FindFirstFile("*.c", &fd); /* 検索失敗? */ if(hFind == INVALID_HANDLE_VALUE) { printf("検索失敗\n"); return; /******** エラー終了 ********/ } do { /* 結果の表示 */ printf("ファイル名: %s", fd.cFileName); } while(FindNextFile(hFind, &fd)); '次のファイルを検索 /* 検索終了 */ FindClose(hFind); }
- ベストアンサー
- C・C++・C#
- [C++]WCHARの1文字目しか表示できない
あるWebサイトによると以下のプログラムでディレクトリ内の ファイル一覧を表示できるそうだ。たしかにファイル一覧を 表示できた。しかし、わたしの電子計算機上では、 ファイル名の1文字目しか表示できない。 なおfd.cFileNameはWCHARという配列のようだ。fd.cFileName[2]のように 文字位置を指定すれば、1文字目以降を取得できる。 Windows XP SP3 Visual C++ 2008 Express Edition ーーーーーーーーーーーーーーーーーーーーーーーーー #include <stdio.h> #include <string> #include <iostream> #include "windows.h" using namespace std; int main(int argc, char *argv[]) { HANDLE hFind; WIN32_FIND_DATA fd; FILETIME ft; SYSTEMTIME st; wstring FName; FName = L"*.*"; /* 最初のファイル検索 */ hFind = FindFirstFile(FName.c_str(), &fd); /* 検索失敗? */ if(hFind == INVALID_HANDLE_VALUE) { printf("検索失敗\n"); return(0); /******** エラー終了 ********/ } while(FindNextFile(hFind, &fd)){ FileTimeToLocalFileTime(&fd.ftLastWriteTime, &ft); FileTimeToSystemTime(&ft, &st); printf("ファイル名: %s", fd.cFileName); if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { printf("(ディレクトリ)"); } printf("\n短いファイル名: %s\n", fd.cAlternateFileName); printf("ファイルサイズ: %d\n", fd.nFileSizeLow); printf("更新日: %04d/%02d/%02d %02d:%02d:%02d\n\n",st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); } /* 検索終了 */ FindClose(hFind); return(0); }
- ベストアンサー
- C・C++・C#
- ファイル名の検索について
現在、あるフォルダの中に存在するテキストファイル名を列挙するソースを書いているのですが、よく分らない現象が出ていて困っています。 たとえば、デスクトップ上のtestというフォルダの中にa.txtと言うテキストファイルがあるとして、下記のプログラムを実行したところ、3回も検索されてしまいます。(メッセージボックスが"a.txt"で3回繰り返される) なぜ、このような現象が起ってしまうか、検討がつきません。何方か、心当たりがあるかた、ご教授願います。 開発環境 VC++2003, Win2000 pro sp4 <ソース> #defien FILE_PATH "C:/Documents and Setting/Administrator/デスクトップ/test/*.txt" HANDLE hFind; WIN32_FIND_DATA strW32fdata; char cMsg[ 256 ]; hFind = FindFirstFile( FILE_PATH, &strW32fdata); if( hFind != INVALID_HANDLE_VALUE ) { do { MessageBox( strW32fdata.cFileName, "file", MB_OK | MB_ICONINFORMATION ); }while( FindNextFile( hFind, &strW32fdata ) ); FindClose( hFind ); } よろしくお願い致します。
- 締切済み
- C・C++・C#
- C言語 ファイル検索
ファイルを検索するときなんですが*.cのファイルを検索するには下のように書くんですが、*.exeのように2種類のファイルを検索すにはどう付け加えればいいでしょうか? void DoFind() { HANDLE hFind; WIN32_FIND_DATA fd; FILETIME ft; SYSTEMTIME st; /* 最初のファイル検索 */ hFind = FindFirstFile("*.c", &fd); /* 検索失敗? */ if(hFind == INVALID_HANDLE_VALUE) { printf("検索失敗\n"); return; /******** エラー終了 ********/ } do { /* 更新時間取得 */ FileTimeToLocalFileTime(&fd.ftLastWriteTime, &ft); FileTimeToSystemTime(&ft, &st); /* 結果の表示 */ printf("ファイル名: %s", fd.cFileName); if(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { printf("(ディレクトリ)"); } printf("\n短いファイル名: %s\n", fd.cAlternateFileName); printf("ファイルサイズ: %d\n", fd.nFileSizeLow); printf("更新日: %04d/%02d/%02d %02d:%02d:%02d\n\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); } while(FindNextFile(hFind, &fd)); '次のファイルを検索 /* 検索終了 */ FindClose(hFind); }
- ベストアンサー
- C・C++・C#
- C言語のプログラムのエラーについて教えてください
ディレクトリの一覧を調べるようなプログラムを組みました。 参考にしたURLはhttp://q.hatena.ne.jp/1118121349です。 しかし、fatal error C1083: include ファイルを開けません。'stdafx.h': No such file or directoryとエラーが発生しました。 なぜ、エラーが生じているのか教えていただけないでしょうか? よろしくお願いします #include <stdafx.h> #include <windows.h> #include <stdio.h> int main(int argc, char* argv[]) { char dir[512]/*カレントディレクトリ*/,wc[512]/*ワイルドカード付文字列*/; HANDLE hSearch; //見つかったファイルのハンドル WIN32_FIND_DATA fd; //検索データ ::GetCurrentDirectory(512,dir); //カレントディレクトリ取得 wsprintf(wc,”%s¥¥*.*”,dir); //ワイルドカード作成 hSearch=::FindFirstFile(wc,&fd); //最初の検索で使用する関数 if(hSearch!=INVALID_HANDLE_VALUE){ //ファイルが見つかったら次の処理 do{ if(strcmp(fd.cFileName,”.”)&&strcmp(fd.cFileName,”..”)){ //カレントフォルダ、親フォルダは無視 if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY ){ printf(”%s¥¥¥n”,fd.cFileName); //ファイルがディレクトリなら表示に”¥”をつける } else{ printf(”%s¥n”,fd.cFileName); //ファイルならそのまま表示 } } } while(::FindNextFile(hSearch,&fd)); //ファイルがなくなるまで継続 } FindClose(hSearch); //ハンドルを閉じる return 0; }
- ベストアンサー
- C・C++・C#
- 同じ画像検索プログラム
私は今、同じ画像を探し出すプログラムを作っています。 大体の手順としては、 同じ画像を探したい画像ファイル名を手動で入力し読み込み、 その後FindFirstFileで指定したディレクトリにある同じ拡張子を探して、 手動で指定した画像のデータと同じかどうかを比べ、 さらにその後FindNextFileを用いてディレクトリ内の画像ファイルを次々と調べていくというようなものです。 プログラムを大体以下のよう作り実行してみたところ、 一枚目の比較はうまくいくのですが、 二枚目以降の比較になると何故か手動で入力した画像ファイルのデータが変化してしまいます。 具体的には輝度値がFindFirstFileで収得した一枚目との比較のときは100であったのに、 FindNextFileで収得した二枚目以降との比較になると-1になってしまうという感じです。 すなわち、同じ画像を二枚続けて収得しても、 一枚目の画像は同じ、二枚目の画像は異なっていると認識してしまうのです。 この説明では分かりにくいかもしれませんが、 どのような原因、解決法が考えられるか分かる方がいらっしゃったら教えてください。 以下は私が作成したプログラムの大体の内容です HANDLE hFind; WIN32_FIND_DATA fd; 同じ画像を探したい画像ファイル読み込み部 hFind = FindFirstFile("指定ディレクトリ", &fd); do { 収得ファイル読み込み部 画像比較部 }while(FindNextFile(hFind, &fd));
- 締切済み
- C・C++・C#
- strcmp( finddata.cFileName, "." )
http://www.ne.jp/asahi/oh/landd/prog_html/prog23.html 上記のサイトに 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 は偽で、 ……… の部分が実行されません。 どういう場合に ……… の部分の処理がされるんですか?
- ベストアンサー
- C・C++・C#
- Linuxでフォルダ内全ファイル名の読み込み
windowsで以下のような,フォルダ内の全ファイルのファイル名を先頭から順に読みこんでいき,読み込むごとにmain2()で処理を行うというプログラムを作りました. これを急遽Linuxで動作させなければならなくなったのですが,windows.hを使用しているので当然動きません. Linuxでdirent.hを使用して動かすにはどうすればよいのでしょうか. あつかましいでしょうが,急ぎの用なので出来れば書き直していただけるとありがたいです. char FilePathBmp[] = "temp\\*.bmp"; // ← Tempフォルダ内のbmpファイルを指定しています char FindPathBmp[50]; HANDLE hFind; WIN32_FIND_DATA fd; CreateColortable(); hFind = FindFirstFile( FilePathBmp, &fd ); do { strcpy( FindPathBmp, fd.cFileName ); main2(FindPathBmp); } while( FindNextFile( hFind, &fd ) );
- ベストアンサー
- C・C++・C#
- C++のCopyFileでメモリが増える
C++にあるCopyFile関数でフォルダをコピーする関数を作成しました。 コピー関数を使うプログラムは常駐プログラムです。 Aフォルダに決められたファイルが作成されたら、A1フォルダを作成してそのなかにAフォルダのファイルをコピーしていきます。 A1の次はA2、A3…というふうにどんどんファイルをコピーしていくのですが、メモリが増えていくだけで、減りません。 このままいくとメモリリークとなってしまうと思うのですが、なぜ増えて行くのでしょうか? 下がプログラムです。 int FoldersCopy(CString from, CString to) { HANDLE hSearch; WIN32_FIND_DATA fd; CString FindPath; //検索用のパス FindPath = from; //コピー if (FindPath.Right(1) != L"\\") { FindPath += L"\\"; } FindPath += L"*.*"; hSearch = FindFirstFile(FindPath, &fd); while(TRUE) { if (!FindNextFile(hSearch, &fd)) { break; } if (fd.cFileName != L"." || fd.cFileName != L"..") { CString fFilepath, tFilepath; fFilepath = from + fd.cFileName; tFilepath = to + fd.cFileName; CopyFile(fFilepath, tFilepath, TRUE); fFilepath.Empty(); tFilepath.Empty(); } } FindClose(hSearch); return 0; } 解放はしっかりやっていると思うのですが、何かいけない場所はありますか? そもそも常駐プログラムでファイルコピーをしたらダメなのでしょうか? よろしくお願い致します。
- 締切済み
- C・C++・C#
- 実行ファイルのサブフォルダのファイル名変更で
h = FindFirstFile("bitmap\\*.txt", &fd); if(h == INVALID_HANDLE_VALUE){ MessageBox(NULL, "ファイルが見つかりませ ん", "エラー", MB_OK | MB_ICONERROR | MB_RIGHT); return 1; } このようにして実行ファイルのサブフォルダにあるtxtファイルを見つけることはできるのですが、このサブフォルダにあるtxtファイルのファイル名を1に変更しようとMoveFile( fd.cFileName, filename )などとしてもファイル名が変更できません。サブフォルダではなく、、((h = FindFirstFile("*.txt", &fd)のように指定して、実行ファイルにあるtxtのファイル名は変更できます。この実行ファイルのサブフォルダにある任意のtxtファイルを見つけだし、ファイル名を変える何かいい方法があればご教授お願いいたします。
- ベストアンサー
- C・C++・C#
お礼
ありがとうございます。 下記のコードを試しました。期待通りの動作を致しました。 大変ありがとうございます。 #include <stdio.h> #include <string.h> void main () { char a1[] = "aaa"; char a2[] = "aaa"; if ( a1 == a2){ printf ( "TRUE\n"); } else { printf ( "FALSE\n"); } if ( strcmp ( a1,a2 ) == 0 ){ printf ( "TRUE\n"); } else { printf ( "FALSE\n"); } } 結果 FALSE TRUE おおお、できました。