CString提取文件路径

时间:2009-10-11 20:07:15

标签: c++ find

嘿我正在尝试提取文件路径,但问题是我陷入了无限循环,不明白为什么。请看一下我的代码。

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,为什么函数无法找到其余的'\' ?所以现在我处于一个无限循环中:(。

6 个答案:

答案 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;