c ++ Windows API递归搜索未返回预期目录

时间:2015-10-20 01:35:54

标签: c++ winapi recursion

我目前正在尝试编写一个程序,使用windows.h中的实用程序递归搜索文件。当我执行以下代码时,文件路径不断添加到搜索的最后一个文件路径,但不搜索文件夹,并且不会将句柄标记为无效。我已经炖了几天了。为什么这不是递归搜索? 编辑:更正代码以使用按位比较。发生了同样的错误。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup x:Name="VisualStateGroup">
                <VisualState x:Name="NarrowView">
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="0" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="Grid2.(RelativePanel.Below)" Value="Grid1"/>
                    </VisualState.Setters>
                </VisualState>
                <VisualState x:Name="WideView">
                    <VisualState.StateTriggers>
                        <AdaptiveTrigger MinWindowWidth="720" />
                    </VisualState.StateTriggers>
                    <VisualState.Setters>
                        <Setter Target="Grid2.(RelativePanel.RightOf)" Value="Grid1"/>
                    </VisualState.Setters>
                </VisualState>
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <RelativePanel>
            <Grid x:Name="Grid1">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <TextBox Grid.Row="0" FontSize="20" PlaceholderText="NOME" />
            </Grid>
            <Grid x:Name="Grid2">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" FontSize="17" Text="Note" Foreground="#222222" Margin="20,15" ></TextBlock>
                <TextBox Grid.Row="2" MaxLength="0" FontSize="17" Height="500" PlaceholderText="AGGIUNGI NOTA" ></TextBox>
            </Grid>
        </RelativePanel>
    </Grid>

1 个答案:

答案 0 :(得分:1)

这是递归搜索的一个简单示例。请注意,它使用do{...}while(...);,这样可以更轻松地跳到循环结束

void findfile_recursive(const std::wstring &folder, const std::wstring &filename, std::vector<std::wstring> &files)
{
    std::wstring wildcard = folder + L"\\*";
    WIN32_FIND_DATA fd;
    HANDLE handle = FindFirstFile(wildcard.c_str(), &fd);
    if (handle == INVALID_HANDLE_VALUE)
        return;
    do
    {
        if (wcscmp(fd.cFileName, L".") == 0 || wcscmp(fd.cFileName, L"..") == 0)
            continue;
        std::wstring path = folder + L"\\" + std::wstring(fd.cFileName);

        if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            findfile_recursive(path, filename, files);
        else if (_wcsicmp(fd.cFileName, filename.c_str()) == 0)
            files.push_back(path);

    } while (FindNextFile(handle, &fd));
    FindClose(handle);
}

int _tmain(int, wchar_t*[])
{
    std::vector<std::wstring> files;
    findfile_recursive(L"c:\\test", L"file.txt", files);
    for (auto file : files)
        std::wcout << file << endl;
}

您可以将功能更改为使用do / while。在递归调用函数时,请确保它具有正确的参数。循环中newDir更改,您无法将其重用为参考。请改用Dir

int recursionFindAbsraction(LPWSTR Dir, LPWSTR FilNam, LPWSTR filePath)
{
    ...
    //while (bGetNext)***
    do
    {
        if (wcscmp(ptrFileData.cFileName, L".") == 0 || wcscmp(ptrFileData.cFileName, L"..") == 0)
            continue;

        if (ptrFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
            continue;//***skip hidden files and directories

        if (ptrFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            //***wrong redirection:
            //StringCchCatW(newDir, MAX_PATH, ptrFileData.cFileName);

            //***change to:
            StringCchCopyW(newDir, MAX_PATH, Dir);
            StringCchCatW(newDir, MAX_PATH, ptrFileData.cFileName);
            recursionFindAbsraction(newDir, FilNam, filePath);
        }
        else if (_wcsicmp(ptrFileData.cFileName, FilNam) == 0)
        {
            std::wcout << "The first file found is: " << Dir << ptrFileData.cFileName << endl;
        }

    } while (FindNextFile(hFile, &ptrFileData));//***

    FindClose(hFile);
    return 0;
}