こんにちは皆私はここで初心者です。私はこの問題を投稿したいと思っていました。ドライブ内の特定の拡張子を持つすべてのファイルのリストを取得する方法は?
特定のファイルタイプを検索するすべてのフォルダとサブフォルダを再帰的に繰り返すC++プログラムを開発しています。
最初に、機能FindFiles(string, string, bool)
は魅力的ですが、その2番目の形式FindFiles(struct var)
はうまく動作しません。すべてのフォルダとサブフォルダに対して繰り返し処理を行いません。実際に
検索が長すぎるかもしれないという事実として、私はAPI CreateThread
でスレッドを作成し、LPVOID
としてそれを私のarguments struct
を渡す必要があるので、私は2番目のフォームを必要としています。
#include <windows.h>
#include <string>
#include <iostream>
using namespace std;
// Arguments struct
struct args{
string strDir;
string strFilter;
bool bRecurse;
};
void FindFiles(string strDir, string strFilter, bool bRecurse);
void FindFiles(args);
int main(){
// FindFiles("D:", "*.mp3", true); // works fine
args ar;
ar.bRecurse = true;
ar.strDir = "D:";
ar.strFilter = "*.mp3";
FindFiles(ar); // doesn't work fine
cout << endl;
return 0;
}
void FindFiles(string strDir, string strFilter, bool bRecurse = true){
if(bRecurse)
FindFiles(strDir, strFilter, false);
strDir += "\\";
WIN32_FIND_DATA wfd;
string strFileFilter = strDir + (bRecurse ? "*" : strFilter);
HANDLE hFile = FindFirstFile(strFileFilter.c_str(), &wfd);
if(INVALID_HANDLE_VALUE == hFile)
return;
else{
if(!bRecurse)
cout << strDir + string(wfd.cFileName) << endl;
while(FindNextFile(hFile, &wfd)){
if(!bRecurse)
cout << strDir + string(wfd.cFileName) << endl;
else{
if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) > 0 &&
wfd.cFileName[0] != '.')
FindFiles(strDir + string(wfd.cFileName), strFilter, true);
}
}
// FindClose(hFile);
}
}
void FindFiles(args ar){
if(ar.bRecurse){
ar.bRecurse = false;
FindFiles(ar);
}
ar.strDir += "\\";
WIN32_FIND_DATA wfd;
string strFileFilter = ar.strDir + (ar.bRecurse ? "*" : ar.strFilter);
HANDLE hFile = FindFirstFile(strFileFilter.c_str(), &wfd);
if(INVALID_HANDLE_VALUE == hFile)
return;
else{
if(!ar.bRecurse)
cout << ar.strDir + string(wfd.cFileName) << endl;
while(FindNextFile(hFile, &wfd)){
if(!ar.bRecurse)
cout << ar.strDir + string(wfd.cFileName) << endl;
else{
if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) > 0 &&
wfd.cFileName[0] != '.'){
ar.strDir += string(wfd.cFileName);
ar.bRecurse = true;
FindFiles(ar);
}
}
}
FindClose(hFile);
}
}
それは私のものなので2番目のフォームをご覧ください。私はそこにいくつかの愚かな間違いがあると思う。
本当にありがとうございました。サブフォルダを検索するときに、それは常に偽であるので、それはar.bRecurse
フラグを変更しているので、
@RemyLebeau:あなたができるように、実際には最初の形式は、私はインターネットでどこかにそれを見つけました私はそれを編集して2番目のフォームを作っているのを見てください。しかし、あなたが私にいくつかの選択肢をアドバイスしたら、本当に感謝しています。ありがとう! – WonFeiHong
あなたは*道すぎるように努力しています。あなたのために[recursive_directory_iterator](https://docs.microsoft.com/en-us/cpp/standard-library/recursive-directory-iterator-class)を使用してください。また、ネイティブにUnicodeを使用するファイルシステム上のファイル名にANSI/MBCSエンコーディングを使用することはバグです。 – IInspectable
@IInspectable:バグの詳細を説明できました。有用なリンクのためのThanx。 – WonFeiHong