none
Рекурсивная функция возвращает неправильный результат. RRS feed

  • Вопрос

  • Добрый вечер.

    У меня есть функция, которая осуществляет рекурсивный поиск папки внутри диска или папки с заданным именем. При поиске функция просматривает все возможные пути и все уровни вложенности внутри папки или диска в которой (котором) выполняется поиск. Т.е. для поиска просматривается всё что есть внутри заданной папки или диска. А вот и сама функция. В первом аргументе (p_InitialPath) указывается папка или диск, в которой (на котором) нужно искать, а в втором аргументе (p_RequiredFolderName) указывается папка, которую нужно найти.

    string FolderPathValidator::FindRequiredFolder(const string& p_InitialPath, string p_RequiredFolderName)
    	{
    		string foundFolder = "";
    		string folderPath = p_InitialPath + "\\*";
    		WIN32_FIND_DATA folderInfo;
    		HANDLE search_handle = FindFirstFile(folderPath.c_str(), &folderInfo);
    		if (search_handle != INVALID_HANDLE_VALUE)
    		{
    			vector<string> folders;
    
    			do
    			{
    				if (folderInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    				{
    					if ((!lstrcmp(folderInfo.cFileName, ".")) || (!lstrcmp(folderInfo.cFileName, "..")))
    						continue;
    				}
    
    				folderPath = p_InitialPath + "\\" + string(folderInfo.cFileName);
    
    				if (folderInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    				{
    					if (folderInfo.cFileName == p_RequiredFolderName)
    					{
    						foundFolder = folderInfo.cFileName;
    						return foundFolder;
    					}
    					folders.push_back(folderPath);
    				}
    			} while (FindNextFile(search_handle, &folderInfo));
    
    			::FindClose(search_handle);
    
    			for (vector<string>::iterator iter = folders.begin(), end = folders.end(); iter != end; ++iter)
    				FindRequiredFolder(*iter, p_RequiredFolderName);
    		}
    
    		return foundFolder;
    	}

    А вот её вызов в программе:

    string FoundFolder = FindRequiredFolder("С:", "TextFiles_to_Test");

    Но сейчас, даже если я пускаю функцию по заведомо правильному пути, задавая папку или диск, внутри которой (которого) содержится папка, которую нужно найти, то функция всё равно возвращает пустую строку. А в отладчике я проверял. Там она, в этом случае, на очередной рекурсии - находит. Как поправить код, что бы функция возвращала имя папки, заданное в её втором аргументе, если она нашла её?

    Помогите, ребята.



    • Изменено Purple_Apple 19 декабря 2014 г. 15:48
    19 декабря 2014 г. 15:31

Ответы

Все ответы

  • Во-первых, у вас буква диска "С:" - русская. Понятно, что это лишь при вставке сообщения на форум, но в любом случае будьте внимательны, это причины частых ошибок в коде.

    Во-вторых, у вас что, в настройках проекта стоит кодировка Multi-Byte Character? В 21-ом веке это не комильфо! Используйте юникод.

    В-третьих, не используйте сишную функцию strcmp. В C++ строки сравнивайте знаком =.

    Теперь по делу.

    for (vector<string>::iterator iter = folders.begin(), end = folders.end(); iter != end; ++iter)
    	FindRequiredFolder(*iter, p_RequiredFolderName);


    Здесь у вас теряется найденное значение, оно никак не используется. Перепишите как-нибудь так:

    for (vector<string>::iterator iter = folders.begin(), end = folders.end(); iter != end; ++iter)
    {
    	string temp = FindRequiredFolder(*iter, p_RequiredFolderName);
    	if (temp == p_RequiredFolderName)
    		return temp; // *iter + "\\" + temp;
    }

    Так возвращается найденое значение.

    А по идее, нужно возвращать полный путь, как я написал в комментарии.


    • Изменено Petalvik 19 декабря 2014 г. 17:57
    19 декабря 2014 г. 17:52
  • Спасибо большое. Но извините, пожалуйста, а как действительно переделать эту функцию, что бы она возвращала полный путь к найденной папке? Т.е. к той папке, которую требуется найти - имя которой задано в втором аргументе.
    19 декабря 2014 г. 19:33
  • Спасибо. Я увидел и взял в Stack Overflow: http://stackoverflow.com/questions/27568785/recursive-function-doesnt-return-correct-value  . Работает как положено.  Ещё раз огромное спасибо.
    • Помечено в качестве ответа Purple_Apple 20 декабря 2014 г. 7:40
    • Изменено Purple_Apple 20 декабря 2014 г. 7:42
    20 декабря 2014 г. 7:40