3
std::wstring inxmpath ( L"folder" );
HANDLE hFind;
BOOL bContinue = TRUE;
WIN32_FIND_DATA data;
hFind = FindFirstFile(inxmpath.c_str(), &data); 
// If we have no error, loop through the files in this dir
int counter = 0;
while (hFind && bContinue) {
        std::wstring filename(data.cFileName);
        std::string fullpath = "folder/";
        fullpath += (const char* )filename.c_str();
        if(remove(fullpath.c_str())!=0) return error;
    bContinue = FindNextFile(hFind, &data);
    counter++;
}
FindClose(hFind); // Free the dir

なぜ機能しないのかわかりません。wstringとstringの間の変換と関係があると思いますが、それについてはよくわかりません。いくつかの.txtファイルを含むフォルダーがあります。C++を使用してそれらをすべて削除する必要があります。その中には何もフォルダがありません。これはどれほど難しいですか?

4

3 に答える 3

2

FindFirstFile第二に、関数についてのMSDNによると:

「特定の名前(またはワイルドカードが使用されている場合は部分的な名前)と一致する名前のファイルまたはサブディレクトリをディレクトリで検索します。」

入力文字列にワイルドカードが表示されないため、現在の実行ディレクトリで名前がFindFirstFile付けられたファイルを検索することしか推測できません。"folder"

を探してみてください"folder\\*"

于 2012-09-17T15:16:32.990 に答える
0

私が見ることができる2つの問題:

1)必要な場合は、ワイドストリングのみに固執します。代わりにDeleteFileを呼び出してみてください(プロジェクトがUNICODEであると仮定します)。これは、ワイド文字列を渡すことができます。

2)相対パスを使用しています。絶対パスの方が堅牢です。

于 2012-09-17T15:20:06.640 に答える
0

代わりにこれを試してください:

std::wstring inxmpath = L"c:\\path to\\folder\\"; 
std::wstring fullpath = inxmpath + L"*.*";

WIN32_FIND_DATA data; 
HANDLE hFind = FindFirstFileW(fullpath.c_str(), &data);  
if (hFind != INVALID_HANDLE_VALUE)
{
    // If we have no error, loop through the files in this dir 
    BOOL bContinue = TRUE; 
    int counter = 0; 
    do
    { 
        if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
        {
            fullpath = inxmpath + data.cFileName; 
            if (!DeleteFileW(fullpath.c_str()))
            {
                FindClose(hFind);
                return error; 
            }
            ++counter; 
            bContinue = FindNextFile(hFind, &data); 
        }
    }
    while (bContinue);
    FindClose(hFind); // Free the dir 
} 
于 2012-09-17T21:16:19.177 に答える