我编写的函数(在MS VS 2013中的Visual C ++中)与
上的函数不同Recursively searching for files in the computer
以下是我的函数的源代码:
wstring FolderPathValidator::FindRequiredFolder(const wstring& p_InitialPath, wstring p_RequiredFolderName)
{
wstring foundFolder = L"";
wstring folderPath = p_InitialPath + L"\\*";
WIN32_FIND_DATAW folderInfo;
HANDLE search_handle = FindFirstFileW(folderPath.c_str(), &folderInfo);
if (search_handle != INVALID_HANDLE_VALUE)
{
vector<wstring> folders;
do
{
if (folderInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if ((!lstrcmpW(folderInfo.cFileName, L".")) || (!lstrcmpW(folderInfo.cFileName, L"..")))
continue;
}
folderPath = p_InitialPath + L"\\" + wstring(folderInfo.cFileName);
if (folderInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (folderInfo.cFileName == p_RequiredFolderName)
{
foundFolder = folderInfo.cFileName;
return foundFolder;
}
folders.push_back(folderPath);
}
} while (FindNextFileW(search_handle, &folderInfo));
CloseHandle(search_handle);
for (vector<wstring>::iterator iter = folders.begin(), end = folders.end(); iter != end; ++iter)
FindRequiredFolder(*iter, p_RequiredFolderName);
}
return foundFolder;
}
功能开始没有问题。但是当它试图执行该行
时CloseHandle(search_handle);
然后出现以下异常:
First step of exception handling on address 0x76D712C7 в WordsCounter.exe: 0xC0000008: An invalid handle was specified.
其中'WordsCounter'是应用程序可执行文件的名称。 FindRequiredFolder函数是FolderPathValidator类的成员。 FolderPathValidator类位于静态类库项目中。这两个项目:使用库的类库和C ++控制台应用程序都在同一个解决方案中。在文件和文件夹名称中,有时会出现西里尔字母的俄文名称。但我不认为西里尔文件夹或文件名是这个错误的原因。这个错误的原因是什么?我该如何纠正?请帮忙。
答案 0 :(得分:1)
使用FindClose
代替CloseHandle
。你在哪里读到必须使用CloseHandle?
使用T()或TEXT()宏,l&#34; unicode字符串的前缀(TEXT( "" )
)。
使用不lstrcmp
的{{1}}。它是宏,如果您的项目是Unicode,则调用lstrcmpW。