Windowsでファイルリストを取得する方法

このQ&Aのポイント
  • Windowsで任意のフォルダにあるファイル名のリストを取得する方法を教えてください。
  • 作成された日付が古い順にリストを取得することは可能でしょうか。
  • Visual Studioコードを使用したC++のサンプルコードで説明してください。
回答を見る
  • ベストアンサー

ファイル名のリスト取得について2

windowsで任意のフォルダにあるファイル名のリストを取得する方法を教えて頂きました。 ※例えば*.ecdのファイルリストを取得する場合です。 これを作成された日付が古い順に取得する事は出来ますでしょうか #include <windows.h> #include <stdio.h> int main() { WIN32_FIND_DATA ffd; HANDLE h = FindFirstFile("d:\\work\\*.ecd", &ffd); if ( h != INVALID_HANDLE_VALUE ) { do { puts(ffd.cFileName); } while ( FindNextFile(h, &ffd) ); FindClose(h); } }

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

  • ベストアンサー
回答No.4

× strcpy(*ecoFileList, iter->second); ○ strcpy(*ecoFileList, iter->second.c_str());

その他の回答 (3)

回答No.3

> ただこちらの環境だとエラーが出ました。。 > 間違い等ありましたら教えて下さい。 そちらの環境がいかなるものかわからんので教えようがない。 どこでどんなエラーがでたのかわからんので教えようがない。

babel05177
質問者

補足

すみません、一応考えてみましたが、文字列のコピーでエラーになります。 error C2664: 'strcpy' : 2 番目の引数を 'std::string' から 'const char *' に変換できません。(新しい機能 ; ヘルプを参照) との事です。 これで解決出来るのですが、おわかりですか? charにコピー出来るなら何を使用しても構わないのですが(strcpyを使用しています) 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); } char string[32]; for ( map_type::iterator iter = files.begin(); iter != files.end(); ++iter ) { strcpy(*ecoFileList, iter->second); ecoFileList++; } }

回答No.2

> 出来ましたらどなたかソートの方法を教えてください C++で書いてみた。 Cはメンドクセーので勘弁して。 #include <windows.h> // FindFirstFile,FindNextFile, etc. #include <utility> // pair #include <map> // multimap #include <string> // string #include <iostream> // cout, endl #include <iomanip> // setfill, setw using namespace std; bool operator<(const FILETIME& x, const FILETIME& y) { if ( x.dwHighDateTime < y.dwHighDateTime ) return true; if ( y.dwHighDateTime < x.dwHighDateTime ) return false; return x.dwLowDateTime < y.dwLowDateTime; } int main() { multimap<FILETIME,string> files; WIN32_FIND_DATA ffd; HANDLE h = FindFirstFile("d:\\work\\*.cpp", &ffd); if ( h != INVALID_HANDLE_VALUE ) { do { files.insert(make_pair(ffd.ftCreationTime, ffd.cFileName)); } while ( FindNextFile(h, &ffd) ); FindClose(h); } for ( auto iter = files.begin(); iter != files.end(); ++iter ) { SYSTEMTIME t; FileTimeToSystemTime(&iter->first,&t); cout << setfill('0'); cout << setw(4) << t.wYear << '/' << setw(2) << t.wMonth << '/' << setw(2) << t.wDay << ' ' << setw(2) << t.wHour << ':' << setw(2) << t.wMinute << ':' << setw(2) << t.wSecond << '.' << t.wMilliseconds << '\t' << iter->second << endl; } }

babel05177
質問者

補足

ありがとうございます。ただこちらの環境だとエラーが出ました。。 間違い等ありましたら教えて下さい。

回答No.1

できますとも。 WIN32_FIND_DATA構造体の中に作成された日時が格納されています。 それをキーにソートすればいい。

参考URL:
http://msdn.microsoft.com/en-us/library/aa365740.aspx
babel05177
質問者

補足

ありがとうございます。出来ましたらどなたかソートの方法を教えてください

関連するQ&A

  • ファイル名リストの置換処理

    以前、ファイルリストの取得について教えて頂きました。ありがとうございます。 取得したリストを文字列で入れ替えるにはどうすればよいでしょうか 例えば取得したリストの最初の位置の文字列dml[0]をEcoDataFileNameと置き換えたいです。 #include <Windows.h> #include <map> #include <vector> #include <string> #include <iostream> #include "time.h" using namespace std; bool operator<(const FILETIME& x, const FILETIME& y) { if ( x.dwHighDateTime < y.dwHighDateTime ) return true; if ( y.dwHighDateTime < x.dwHighDateTime ) return false; return x.dwLowDateTime < y.dwLowDateTime; } class DML_Backup { vector<string> files_; public: void search(const char* spec) { typedef multimap<FILETIME,string> map_type; map_type files; WIN32_FIND_DATAA find_data; HANDLE handle = FindFirstFileA(spec, &find_data); if ( handle != INVALID_HANDLE_VALUE) { do {   files.insert(map_type::value_type(find_data.ftLastWriteTime, find_data.cFileName)); } while ( FindNextFileA( handle, &find_data) ); FindClose(handle); } files_.clear(); for ( map_type::iterator iter = files.begin(); iter != files.end(); ++iter ) { files_.push_back(iter->second); } } string operator[](int inx) const { return files_.at(inx).c_str(); } int size() const { return files_.size(); } }; int main() { DML_Backup dml; char EcoDataFileName="MonJun131956122011.ecd"; dml.search("*.ecd"); }

  • ファイル名のリスト取得について

    windowsで任意のフォルダにあるファイル名のリストを取得する方法を教えて下さい。 例えば*.ecdのファイルリストを取得するとします。 よろしくお願いします

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

  • 文字列のコピー

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

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

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

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

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

  • デスクトップ上の全ファイル取得

    開発環境 WindowsXP,SP2 Visual Studio 2005 VC++ SDK SHGetFolderPath()でデスクトップのパスを取得した後、FindFirstFileによってデスクトップ上の全ファイル及びディレクトリの名前を取得したいと考えております。 SHGetFolderPathで取得したパスは、 C:\Documents and Settings\...\デスクトップ となっており、この文字列をwsprintfで次のように加工しました。 wsprintf(output,"%s\\*.*","C:\Documents and Settings\...\デスクトップ"); このoutputをFindFirstFile,FindNextFile,FindCloseを組み合わせたプログラムでディレクトリ内の全てのファイル及びディレクトリの名前を取得しています。 このプログラムは普通(?)のディレクトリでは有効で、こちらの期待通りの動きをしてくれるのですが、取得したデスクトップのパスを渡すと、デスクトップフォルダ内にはデスクトップという名前のフォルダしかないと出力されます。以下のような感じです。 調査ディレクトリ:C:\Documents and Settings\...\デスクトップ 調査結果 "C:\Documents and Settings\...\デスクトップ"ディレクトリ内のファイル及びディレクトリ:デスクトップ これはWindowsの仕様の動作なのでしょうか。 特殊フォルダであるデスクトップは、FindFirstFileでは調査出来ないのでしょうか? 他に方法はありますか? どうか教えてください。

  • FindFirstFile ハンドル開放

    dat.datファイルの情報を、WIN32_FIND_DATA構造体に得るために  handle = FindFirstFile("dat.dat", &win32finddata);  FindClose(handle);  //この後でwin32finddataを利用。 としているんだけど、今回はハンドルを使わないから  FindFirstFile("dat.dat", &win32finddata);  //この後でwin32finddataを利用。 として、FindFirstFileの返り値の取得と、FindClose関数を 省略してもいいんですか?