我目前正在尝试编写一个程序,使用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>
答案 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;
}