2

当我尝试调用CFileFind.FindFile(_T("D://Folder//*.txt"))时,当唯一的文件是“foobar.txta”时,该方法返回 true。

但是,我不希望文件 foobar.txta 包含在查找结果中。我怎么做到这一点?可能通过使用其他方法或其他 if ?我是 C++ 的新手 :))

注意:如果 exension 小于 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

正如其他回答者所指出的,明显的错误是因为 Windows 文件具有 8.3 别名,导致“foobar.txta”被检测为“foobar.txt”。要确保 CFileFind 找到的文件确实与通配符模式匹配,请使用“PathMatchSpec”来验证 finder.GetNextFile() 返回的文件。PathMatchSpec似乎不受 8.3 别名的影响。

于 2012-09-26T10:25:06.503 回答
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 回答