• ベストアンサー

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); }

質問者が選んだベストアンサー

  • ベストアンサー
  • Sins
  • ベストアンサー率39% (16/41)
回答No.2

#1さん 最近コーディングしていないのではっきり覚えていないのですが strcmp だったと思います。 あと大小判定となるので do { if (strcnp(fd.cFileName, "main.c") != 0) { /* 結果の表示 */ printf("ファイル名: %s", fd.cFileName); } } while(FindNextFile(hFind, &fd)); '次のファイルを検索 だと思います。 この場合、main.c のファイル名に大文字が混じった MAIN.C やMain.c等は表示されます。

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

WindowsAPIを使ってるんでしたら lstrcmpiを使用してチェックしましょう。 これは大文字、小文字を区別しません。

  • mappy88
  • ベストアンサー率20% (15/75)
回答No.1

do { if (strconv(fd.cFileName, "main.c") == false) { /* 結果の表示 */ printf("ファイル名: %s", fd.cFileName); } } while(FindNextFile(hFind, &fd)); '次のファイルを検索 strconv・・・でよかったかな?(^^;

関連するQ&A

  • 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++]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言語のプログラムのエラーについて教えてください

    ディレクトリの一覧を調べるようなプログラムを組みました。 参考にした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; }

  • 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 ) ) ; お手数ですがご教授お願いします。

  • 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; } 解放はしっかりやっていると思うのですが、何かいけない場所はありますか? そもそも常駐プログラムでファイルコピーをしたらダメなのでしょうか? よろしくお願い致します。

  • ファイル名の検索について

    現在、あるフォルダの中に存在するテキストファイル名を列挙するソースを書いているのですが、よく分らない現象が出ていて困っています。 たとえば、デスクトップ上の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 ); } よろしくお願い致します。

  • 同じ画像検索プログラム

    私は今、同じ画像を探し出すプログラムを作っています。 大体の手順としては、 同じ画像を探したい画像ファイル名を手動で入力し読み込み、 その後FindFirstFileで指定したディレクトリにある同じ拡張子を探して、 手動で指定した画像のデータと同じかどうかを比べ、 さらにその後FindNextFileを用いてディレクトリ内の画像ファイルを次々と調べていくというようなものです。 プログラムを大体以下のよう作り実行してみたところ、 一枚目の比較はうまくいくのですが、 二枚目以降の比較になると何故か手動で入力した画像ファイルのデータが変化してしまいます。 具体的には輝度値がFindFirstFileで収得した一枚目との比較のときは100であったのに、 FindNextFileで収得した二枚目以降との比較になると-1になってしまうという感じです。 すなわち、同じ画像を二枚続けて収得しても、 一枚目の画像は同じ、二枚目の画像は異なっていると認識してしまうのです。 この説明では分かりにくいかもしれませんが、 どのような原因、解決法が考えられるか分かる方がいらっしゃったら教えてください。 以下は私が作成したプログラムの大体の内容です HANDLE hFind; WIN32_FIND_DATA fd; 同じ画像を探したい画像ファイル読み込み部 hFind = FindFirstFile("指定ディレクトリ", &fd); do { 収得ファイル読み込み部 画像比較部 }while(FindNextFile(hFind, &fd));

  • 文字列のコピー

    ecoFileListに文字列をコピーしたいのですが、エラーになります。 どなたか教えて下さい int DML_Backup::searchEcoDataFileName(char (*ecoFileList)[32]) { map_type files; WIN32_FIND_DATA find_data; HANDLE handle = FindFirstFile("*.ecd", &find_data); if ( handle != INVALID_HANDLE_VALUE) { do { files.insert(map_type::value_type( find_data.ftLastWriteTime, find_data.cFileName)); } while ( FindNextFile( handle, &find_data) ); FindClose(handle); } for ( map_type::iterator iter = files.begin(); iter != files.end(); ++iter ) { lstrcpy(*ecoFileList, iter->second); ecoFileList++; } }

  • C言語にてプログラミングを行っていて、FindFirstFileにてフ

    C言語にてプログラミングを行っていて、FindFirstFileにてファイル名を取得しようとしていますがうまくいきません。 第一引数に「D:\test\aaa*」と指定して、aaa01、aaa02、aaa03のようなファイル名が取得したいと考えています。 FindFirstFileの戻り値として、INVALID_HANDLE_VALUEがくるため目的の動作になりません。 上記のような事はできないのでしょうか? いろいろ調べてみましたが解決できなくて質問させていただきました。 以上ですが、よろしくお願いいたします。

  • プログラムの間違いについて

    以下のプログラムはカレントディレクトリ内のCSVファイルの一覧を取得するプログラムを書いています。main関数内のprintfでファイル一覧を表記させたいと考えています。 カレントディレクトリに4つのCSVファイルあったとします。 1.csv 2.csv 3.csv 4.csvとします。 foo関数で a[0]=1.csv a[1]=2.csv a[2]=3.csv a[3]=4.csvと格納されたとします。 ですが、main関数内のprintfでは a[0]=4.csv a[1]=4.csv a[2]=4.csv a[3]=4.csv として表記されてしまいます。 main関数内で a[0]=1.csv a[1]=2.csv a[2]=3.csv a[3]=4.csv として表記するにはどうしたらいいのでしょうか? また、foo関数内でのprintfを行わないとmain関数内での表記が添付画像のように文字化けしますこの理由はなぜでしょうか? もしわかるかたがいましたら教えていただけないでしょうか? よろしくお願いします。 ここから記述したプログラムです。デバックすれば動きます。 #include <stdio.h> #include <windows.h> #include <string> #include<conio.h> using namespace std; char *a[10]; long n; void foo( int cnt, const string dirname ) { WIN32_FIND_DATA fd; HANDLE h; // ハンドルを取得する h = FindFirstFileEx( ( dirname + "*.csv" ).c_str(), FindExInfoStandard, &fd, FindExSearchNameMatch, NULL, 0 ); if ( INVALID_HANDLE_VALUE == h ) { printf( "ディレクトリ %s でエラー\n", dirname.c_str() ); return ; } n=0; do { printf( "%s\n", fd.cFileName ); a[n]=fd.cFileName; //printf("%s\n", a[n]); n=n+1; // 次のファイルを検索する } while ( FindNextFile( h, &fd ) ); // ハンドルを閉じる FindClose( h ); } int main() { foo( 0, ".\\" ); for(n=0; n<4; n++) { printf("%s\n", a[1]); } getch(); return 0; }

専門家に質問してみよう