CString извлекать путь к файлу - PullRequest
       14

CString извлекать путь к файлу

2 голосов
/ 12 октября 2009

Эй, я пытаюсь извлечь путь к файлу, но проблема в том, что я застрял в бесконечном цикле, не понимаю, почему. Пожалуйста, посмотрите на мой код.

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 ]

3 голосов
/ 18 октября 2013

ваш код никогда не будет работать! Когда цикл while завершен, нельзя использовать аргумент pos. Вот решение, которое будет работать:

CString folderPath;
int pos = myString.ReverseFind('\\');
if (pos != -1)
{
    folderPath = myString.Left(pos);
}
3 голосов
/ 12 октября 2009

Звучит так, как будто Find содержит символ в той позиции, которую вы задали при поиске. Поэтому, если вы зададите ему позицию символа, которая соответствует поиску, он вернет эту же позицию.

Возможно, вам нужно изменить его на:

pos = myString.Find(_T("\\"), pos + 1);
1 голос
/ 06 марта 2016

в 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;
1 голос
/ 12 октября 2009

Я могу понять вашу первоначальную реализацию, так как поведение CString :: Find (), похоже, со временем изменилось.

Посмотрите документы MSDN для реализации MFC, поставляемые с VC6 здесь и текущую реализацию здесь . Особенно обратите внимание на различия в описании 2-го параметра смещения.

Решение вашей проблемы состоит в том, чтобы, как уже говорилось выше, добавить 1 к смещению поиска последовательных вызовов Find (). Вы также можете искать отдельные символы (или wchar_ts) следующим образом:

myString.Find(_T('\\'), pos+1);

EDIT:

Кстати, взгляните на Path * familly функций, предоставляемых shlwapi.dll, объявленных в shlwapi.h. Особенно вас может заинтересовать функция PathRemoveFileSpec .

1 голос
/ 12 октября 2009

Вы можете исправить код (см. Ответы pos + 1), но я думаю, что вы должны использовать _splitpath_s вместо того, который был предназначен для этого вида операций.

1 голос
/ 12 октября 2009

CString::Find всегда возвращает первое вхождение искомого персонажа. Так что он продолжает находить первое "\\", которое по индексу 2 бесконечно, так как вы ищете из 2, которое включает в себя это "\\"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...