嘿我正在尝试提取文件路径,但问题是我陷入了无限循环,不明白为什么。请看一下我的代码。
CString myString(_T("C:\\Documents and Settings\\admin\\Desktop\\Elite\\Elite\\IvrEngine\\dxxxB1C1.log"));
int pos = myString.Find(_T("\\"));
while (pos != -1)
{
pos = myString.Find(_T("\\"), pos); // it keeps returning 2
}
CString folderPath = myString.Mid(pos);
现在的问题是,Find()在我第一次运行时返回2,但是在while循环中它会一直返回2,为什么函数无法找到其余的'\' ?所以现在我处于一个无限循环中:(。
答案 0 :(得分:3)
听起来Find
包含搜索时您给出的位置的字符。因此,如果你给它一个与搜索匹配的字符的位置,那么它将返回相同的位置。
您可能需要将其更改为:
pos = myString.Find(_T("\\"), pos + 1);
答案 1 :(得分:3)
你的代码永远不会有用!当while循环结束时,不能使用pos的内容。 这是一个有效的解决方案:
CString folderPath;
int pos = myString.ReverseFind('\\');
if (pos != -1)
{
folderPath = myString.Left(pos);
}
答案 2 :(得分:1)
CString::Find
始终返回您要搜索的字符的第一个出现位置。所以它一直在寻找无限索引2的第一个"\\"
,因为你从2搜索包括"\\"
答案 3 :(得分:1)
您可以修改代码(请参阅pos + 1答案),但我认为您应该使用_splitpath_s
代替此类操作。
答案 4 :(得分:1)
我可以理解你的初始实现,因为CString :: Find()的行为似乎随着时间的推移而发生了变化。
查看VC6 here附带的MFC实现的MSDN文档以及当前实现here。特别要看第二个偏移参数描述的不同。
如上所述,解决问题的方法是在连续的Find()调用的搜索偏移量中加1。您还可以搜索单个字符(或wchar_ts):
myString.Find(_T('\\'), pos+1);
编辑:
顺便说一下,看一下shlwapi.h中声明的shlwapi.dll暴露的Path*个函数。特别是PathRemoveFileSpec函数可能是您感兴趣的。
答案 5 :(得分:1)
在MFC中,获取包含可执行文件的文件夹的示例:
char ownPth[MAX_PATH];
// Will contain exe path
HMODULE hModule = GetModuleHandle(NULL);
if(NULL == hModule){
return __LINE__;
}
// When passing NULL to GetModuleHandle, it returns handle of exe itself
GetModuleFileName(hModule,ownPth, (sizeof(ownPth)));
modulePath = (LPCSTR)ownPth;
modulePath = modulePath.Left(modulePath.ReverseFind(_T('\\')));
return 0;