2

ディスク上のすべての .wav ファイル (すべてのサブフォルダーとそのサブフォルダーなどを含む...、Avast のウイルス対策検索などのディスク全体の検索など) を検索し、それらをに保存するアプリケーションを C++ で作成しようとしています。文字列を作成し、後でテキスト ファイルに保存します。これを実際に行う方法を理解するのに苦労しており、助けを借りることができます。

これは私がこれまで行ってきたことです.Cドライブのルートフォルダーを検索するだけで、今何をすべきかわかりません. ある種のループを使用する必要があることはわかっていますが、実際にそれを行う方法がわかりません。それを行うと考えることができる論理的な方法はありません。

void finddata()
{
    MessageBox(NULL, "finddata called", "Started", MB_OK | MB_ICONINFORMATION);
    WIN32_FIND_DATA FindFileData; // A pointer to the WIN32_FIND_DATA structure that receives information about a found file or directory.
    HANDLE hFind; // Used to check the return value
    hFind = FindFirstFile("C://*.wav", &FindFileData);
    if(hFind == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, "INVALID_HANDLE_VALUE", "Failed", MB_OK | MB_ICONINFORMATION);
    }
    else
    {
        string file;
        file = FindFileData.cFileName;
        file.append("|");
        MessageBox(NULL, file.c_str(), "YO", MB_OK | MB_ICONASTERISK); // string.c_str() to conv to LPCSTR
        FindClose(hFind);
    }
}

最後の MessageBox はテスト用にあるだけです。後で削除します。私は現在 C++ を学んでおり、これは一種の初心者向けプロジェクトなので、コツをつかむことができます。

また、文字列データ型のサイズに制限はありますか? ありがとう。

4

2 に答える 2

2

明らかに、実際には呼び出しが必要でありFindNextFile、「ファイルがありません」という戻りコードが返されるまで、何らかのループを使用してそれを繰り返します。

次に、ディスク全体を検索するには、「現在のディレクトリ」(ルート ディレクトリ) 内のディレクトリを探す必要があります。ディレクトリを検索するたびに、finddata再帰的に呼び出して (ディレクトリの名前を関数への引数)、またはコードにスタックを実装して、現在のディレクトリを追跡し、次のレベルでどのディレクトリに「戻る」かを追跡します。

意図的にコードを書いているわけではありませんが、プログラミングを学ぶのはあなたなので、何をする必要があるかを説明しています。私は1985年かそこらでこの種のことをしました。

于 2013-06-23T23:55:13.190 に答える
1

再帰性がその方法です。

これが可能な実装です(インスピレーションのためですが、独自の方法で行ってください):

// Filtering by the given extension
void AppendFile(list<string>& fileList, const string& directory, const string& fileName, const string& extFilter)
{
    string fileExtension = fileName.substr(fileName.find_last_of(".") + 1);
    if (!fileExtension.empty())
    {
        // Extension doesn't match: return
        if (extFilter.find(fileExtension) == string::npos)
            return;
    }
    // If we have a match: append file to list
    fileList.push_back(directory + fileName);
}

// Getting the files of the given extension recursively (or not)
void GetFiles(list<string>& fileList, string directory, const string& extFilter, bool recursively = true)
{
    string filePath;

    directory += "\\";
    string filter = directory + "*";

    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = FindFirstFile(filter.c_str(), &FindFileData);

    if (hFind == INVALID_HANDLE_VALUE) return;

    do
    {
        // If we find a (sub-)directory
        if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            // Here comes the recursive call
            if ((recursively) && (lstrcmp(FindFileData.cFileName, TEXT(".")) != 0) && (lstrcmp(FindFileData.cFileName, TEXT("..")) != 0))
                // The 'GetFiles()' calls itself on the sub-directory
                GetFiles(fileList, directory + FindFileData.cFileName, extFilter);
        }
        else
            // If we find a file: simply append it to the list
            AppendFile(fileList, directory, FindFileData.cFileName, extFilter);
    }
    while (FindNextFile(hFind, &FindFileData) != 0);

    FindClose(hFind);
}

使用法 :

list<string> fileList;
GetFiles(fileList, "C:\\root_dir", "wav");

for(list<string>::iterator it = fileList.begin(); it != fileList.end(); ++it)
{
    cout << (*it) << endl;
}
于 2013-06-24T01:52:28.103 に答える