此函数有什么不对的地方,该怎么处理
此函数有什么不对的地方
std::wstring searchFile(std::wstring Name, std::wstring Dir)
{
std::wstring fileName;
wchar_t wq = Dir[wcslen(Dir.c_str()) - 1];
if (wq != '\\'){ Dir = Dir + L"\\"; }
WIN32_FIND_DATA find;
HANDLE handle = FindFirstFile((Dir + L"*").c_str(), &find);
if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
std::wstring tmp = searchFile(Name, Dir + find.cFileName + L"\\");
if (fileName == L""){ fileName = Dir + find.cFileName+L"\\"+tmp; }
else{ fileName = fileName + L"\n" + Dir+find.cFileName+L"\\"+tmp; }
}
else
{
if (fileName == L""){ fileName = Dir + find.cFileName; }
else{ fileName = fileName + L"\n" + Dir+find.cFileName; }
}
while (FindNextFile(handle, &find))
{
if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
std::wstring tmp = searchFile(Name, Dir + find.cFileName + L"\\");
if (fileName == L""){ fileName = Dir + find.cFileName + L"\\" + tmp; }
else{ fileName = fileName + L"\n" + Dir + find.cFileName + L"\\" + tmp; }
}
else
{
if (fileName == L""){ fileName = Dir + find.cFileName; }
else{ fileName = fileName + L"\n" + Dir + find.cFileName; }
}
}
return fileName;
}
用处是将某目录下的所有文件都找出来,路径一行一个放进wstring返回
我用std::wstring temp=searchFile(L"test1", L"H:\\test\\");
发现程序一直卡住,半天没反应,怀疑进了死循环。(此目录总文件数不超过30)
------解决思路----------------------
find判断一下有没有失败
------解决思路----------------------
一个目录树的遍历,只不过目录树中有两个特殊的结点 , . 和.. , 不能够去遍历。去掉试一下
------解决思路----------------------
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
------解决思路----------------------
偶遇到类似问题都是用
“每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。”
的方法解决的。
std::wstring searchFile(std::wstring Name, std::wstring Dir)
{
std::wstring fileName;
wchar_t wq = Dir[wcslen(Dir.c_str()) - 1];
if (wq != '\\'){ Dir = Dir + L"\\"; }
WIN32_FIND_DATA find;
HANDLE handle = FindFirstFile((Dir + L"*").c_str(), &find);
if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
std::wstring tmp = searchFile(Name, Dir + find.cFileName + L"\\");
if (fileName == L""){ fileName = Dir + find.cFileName+L"\\"+tmp; }
else{ fileName = fileName + L"\n" + Dir+find.cFileName+L"\\"+tmp; }
}
else
{
if (fileName == L""){ fileName = Dir + find.cFileName; }
else{ fileName = fileName + L"\n" + Dir+find.cFileName; }
}
while (FindNextFile(handle, &find))
{
if (find.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
std::wstring tmp = searchFile(Name, Dir + find.cFileName + L"\\");
if (fileName == L""){ fileName = Dir + find.cFileName + L"\\" + tmp; }
else{ fileName = fileName + L"\n" + Dir + find.cFileName + L"\\" + tmp; }
}
else
{
if (fileName == L""){ fileName = Dir + find.cFileName; }
else{ fileName = fileName + L"\n" + Dir + find.cFileName; }
}
}
return fileName;
}
用处是将某目录下的所有文件都找出来,路径一行一个放进wstring返回
我用std::wstring temp=searchFile(L"test1", L"H:\\test\\");
发现程序一直卡住,半天没反应,怀疑进了死循环。(此目录总文件数不超过30)
------解决思路----------------------
find判断一下有没有失败
------解决思路----------------------
一个目录树的遍历,只不过目录树中有两个特殊的结点 , . 和.. , 不能够去遍历。去掉试一下
------解决思路----------------------
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
------解决思路----------------------
偶遇到类似问题都是用
“每次用/*...*/注释掉不同部分再重新编译,直到定位到具体语法出错的位置。”
的方法解决的。