Форум программистов, компьютерный форум CyberForum.ru

Рекурсивный поиск файла. Падаю - C++

Восстановить пароль Регистрация
 
TamaGOch
9 / 9 / 0
Регистрация: 11.12.2012
Сообщений: 152
31.12.2013, 21:24     Рекурсивный поиск файла. Падаю #1
используя различные примеры из интернета, написал функцию, которая ищет файл и возвращает путь к этому файлу (без имени самого файла, т.е. путь к директории)
собственно вот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
std::wstring FindFile (std::wstring Directory, std::wstring FileName)
{
    HANDLE hFind;
    WIN32_FIND_DATA FileData; 
    hFind = FindFirstFile((Directory + L"\\*").c_str(), &FileData);
    if (hFind != INVALID_HANDLE_VALUE) //Если директория не пуста
    {
        do
        {
            if (FileData.dwFileAttributes == 16 || FileData.dwFileAttributes == 17) //Если нашли папку
            {
                if (FileData.cFileName [0] != '.')
                {
                    std::wstring res = FindFile (Directory + L"\\" + std::wstring (FileData.cFileName), FileName);
                    if (res != L"") return res;
                } 
            }
            else //Если нашли файл
            {
                if (std::wstring (FileData.cFileName) == FileName) //Сравниваем с требуемым именем файла
                {
                    return Directory;
                }
            }
        }
        while (FindNextFile (hFind, &FileData) == true); //Пока не просмотрели все папки и файлы в директории
        return (L"");
    }
}
вызываю функцию к примеру так
C++
1
std::wstring Dir = FindFile (L"D:", L"I'm here.txt");
при этом ища по всему диску D (не системном), где приличное количество всего, отрабатывает как должно, возвращает пустую строку в случае отсутствия и путь в случае существования

немного иная ситуация с парсингом по системному диску C
C++
1
std::wstring Dir = FindFile (L"C:", L"I'm here.txt");
не знаю, как устроен диск у вас, у меня к примеру идут подряд две такие папки, на диске C в подпапке Program Files,
Microsoft SQL Server
Microsoft SQL Server Compact Edition
операционная система Windows 7 с припиской, не помню какой, хоум вроде как

так вот, если кину файл в первую папку, найдёт, если во вторую то в режиме Debug падает с таким сообщением (скриншот), а в режиме Release отрабатывает, но возвращает пустую строку, хотя файлы есть

подозрений немного, но все не в тему. Единственное, что имеет право на существование - это, возможно, проблема с правами и доступом, но характер ошибки вылетающий смущает. Заранее благодарю
Миниатюры
Рекурсивный поиск файла. Падаю  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.12.2013, 21:24     Рекурсивный поиск файла. Падаю
Посмотрите здесь:

Считать одномерный массив с файла, отсортировать его использую рекурсивный вызов функции C++
Поиск файла. C++
поиск в ширину(Рекурсивный) C++
C++ Рекурсивный поиск файлов и папок
Поиск файла C++
C++ Рекурсивный поиск в списке
Помогите зациклить рекурсивный поиск C++
C++ Поиск файла по маске
Нужны небольшие пояснения по маленькому фрагменту кода, реализующего рекурсивный поиск в глубину по графу C++
Рекурсивный, линейный поиск с использованием вектора C++
C++ Рекурсивный поиск в глубину
C++ Рекурсивный и нерекурсивный поиск в глубину

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TamaGOch
9 / 9 / 0
Регистрация: 11.12.2012
Сообщений: 152
31.12.2013, 21:34  [ТС]     Рекурсивный поиск файла. Падаю #2
если в файл в Microsoft SQL Server Compact Edition
C++
1
std::wstring Dir = FindFile (L"C:\\Program Files\\Microsoft SQL Server Compact Edition", L"I'm here.txt");
так нормально работает
C++
1
std::wstring Dir = FindFile (L"C:\\Program Files", L"I'm here.txt");
так падает
при этом если файл в Microsoft SQL Server
отработает в обоих случаях
C++
1
std::wstring Dir = FindFile (L"C:\\Program Files\\Microsoft SQL Server", L"I'm here.txt");
C++
1
std::wstring Dir = FindFile (L"C:\\Program Files", L"I'm here.txt");
Убежденный
Системный программист
 Аватар для Убежденный
14438 / 6422 / 1015
Регистрация: 02.05.2013
Сообщений: 10,664
Завершенные тесты: 1
01.01.2014, 12:51     Рекурсивный поиск файла. Падаю #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Да тут ошибка чуть ли не в каждой строке кода.

Цитата Сообщение от TamaGOch Посмотреть сообщение
C++
1
std::wstring FindFile (std::wstring Directory, std::wstring FileName)
Эффективнее передавать аргументы по ссылке/указателю. Лучше const.

C++
1
if (FileData.dwFileAttributes == 16 || FileData.dwFileAttributes == 17) //Если нашли папку
Неточность. У папки могут быть и другие атрибуты.
Здесь следует использовать проверку конкретных битов - FILE_ATTRIBUTE_DIRECTORY (0x10), например:
C++
1
2
3
4
if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
    // ...
}
Кроме этого, не следует забывать про reparse points.
Они имеют атрибут директории, но ведут себя совсем по-другому.

C++
1
if (FileData.cFileName [0] != '.')
Кроме ".", есть еще ".." - тоже надо проверять.

C++
1
if (std::wstring (FileData.cFileName) == FileName) //Сравниваем с требуемым именем файла
И это тоже ненадежно. Например, вы ищете файл "program.exe", а на диске он
записан под видом "PROGRAM.EXE" - в итоге поиск завершится неудачей.
Здесь точнее будет использовать какую-нибудь функцию сравнения строк без учета регистра.
Например, lstrcmpi, а еще лучше CompareString.

C++
1
while (FindNextFile (hFind, &FileData) == true);
И это неверно.
Про FindNextFile MSDN говорит, что "if the function succeeds, the return value is nonzero".
Nonzero - это любое значение, отличное от нуля, вовсе необязательно 1/true.

Ну и напоследок:
C++
1
if (hFind != INVALID_HANDLE_VALUE) //Если директория не пуста
А если hFind будет равно INVALID_HANDLE_VALUE, что вернет функция ?
Yandex
Объявления
01.01.2014, 12:51     Рекурсивный поиск файла. Падаю
Ответ Создать тему
Опции темы

Текущее время: 09:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru