2

を呼び出そうとするとCFileFind.FindFile(_T("D://Folder//*.txt"))、ファイルが「foobar.txta」のみの場合、メソッドはtrueを返します。

ただし、ファイルfoobar.txtaを検索結果に含めたくありません。どうすればそのようにできますか?おそらく他の方法または別の方法を使用して?私はC++の初心者です:))

注:この問題は、拡張子が3未満の場合は発生しないようです。たとえば、フィルターが「* .tx」でファイルが「foobar.txt」の場合、メソッドは(正しく)falseを返します。また、問題はここで報告されているようですが、解決策を確認するには料金を支払う必要があるようです

4

4 に答える 4

1

CFindFile(またはWin32 API FindFirstFile)のバグのようです。ただし、CFindFile :: GetFileNameを呼び出すことで、後で実際の拡張子を判別できます。

CFindFile finder;
BOOL bWorking = finder.FindFile(L"*.txt");

while (bWorking)
{
    bWorking = finder.FindNextFile();

    if (finder.GetFileName().Right(finder.GetFileName().ReverseFind(L'.')) != L".txt")
        // the file extension is not .txt
}
于 2012-09-25T08:01:10.750 に答える
0

これがうまくいくことを願っています。

WIN32_FIND_DATA ffd;
    CStringList strFileNameList;
    CStringList strFileMask;
    int iCntFiles = 0;
    HANDLE          hFind     = INVALID_HANDLE_VALUE;
 CONST CHAR cszFileName[] = "test.txt";

 strFileMask = strFileName.Left(strFileName.Find(cszFileName)) + "*.txt";
    hFind          = FindFirstFile(strFileMask.GetBufferSetLength(strFileMask.GetLength()), &ffd);

    if (INVALID_HANDLE_VALUE == hFind) 
    {
        return;
    } 
    else
    {
        // List all the other files in the directory.
        strFileNameList.AddTail(ffd.cFileName);
        iCntFiles++;
        while (FindNextFile(hFind, &ffd) != 0) 
        {
            strFileNameList.AddTail(ffd.cFileName);
            iCntFiles++;
        }
}

これで、保存されているすべてのテキストファイルからCStringList抽出できます。

于 2012-09-25T11:20:07.090 に答える
0

これは、下位互換性のための一般的なWindowsの動作です。「8.3」名のないファイルには、短い同義語が含まれる場合があります。つまり"foobar.txta"、と呼ばれ"foobar.txt"ます。本当に意味が*.txtある場合は、手動で結果を確認する必要があります。*.txt?これらの結果には長い名前が使用されるため、ファイルを破棄できます

後で手動チェックを行うことができますPathMatchSpec("foobar.txta", "*.txt")。名前にもかかわらず、この関数は実際には拡張子のマッチングにのみ適していることに注意してください。動作する以外に何も期待しないでください*.ext

短いファイル名を検索しないWindowsのFindFirstFile/FindNextFile APIに代わるものはありますか?も参照してください。

于 2012-09-25T07:56:29.673 に答える
0

他の回答者が指摘しているように、明らかなバグは、Windowsファイルに8.3エイリアスがあり、「foobar.txta」が「foobar.txt」として検出されるためです。CFileFindによって検出されたファイルが実際にワイルドカードパターンと一致することを確認するには、「PathMatchSpec」を使用して、finder.GetNextFile()によって返されたファイルを検証します。PathMatchSpec8.3エイリアスの影響を受けていないようです。

于 2012-09-26T10:25:06.503 に答える