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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
TamaGOch
9 / 9 / 0
Регистрация: 11.12.2012
Сообщений: 152
#1

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

31.12.2013, 21:24. Просмотров 505. Ответов 2
Метки нет (Все метки)

используя различные примеры из интернета, написал функцию, которая ищет файл и возвращает путь к этому файлу (без имени самого файла, т.е. путь к директории)
собственно вот
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++
Всем привет! Нажно реализовать поиск файлов по маске. Набрасал вот такой код: int search_file(string disk, string mask) { char...

поиск в ширину(Рекурсивный) - C++
Программа запускается но выдает ошибку(Задача такая: Создать программу для решения задачи построения слова из некоторого множества букв...

Рекурсивный поиск в глубину - C++
Нужно найти путь по простому лабиринту от точки к точке, используя в программе рекурсивный поиск в глубину. Фотографию примера лабиринта...

Рекурсивный поиск в списке - C++
Добрый вечер. Я решал одну задачку из книги Х.Дейтела и П.Дейтела "Как программировать на C++" и у меня возникла одна проблема. ...

Рекурсивный поиск файлов и папок - C++
в консоли выводится бесконечный повторяющийся список, как этого избежать?! #include <stdio.h> #include <windows.h> #include <conio.h>...

Помогите зациклить рекурсивный поиск - C++
Помогите зациклить поиск(пока работает для 2 список, если их больше не работает), вот часть кода if(NamebType.compare("Struct")==0) { ...

Рекурсивный и нерекурсивный поиск в глубину - C++
Не уверен в правильности работы даной функции. Если начинать с вершины 2, то рекурсивный и нерекурсивный поиски дадут одинаковые...

Рекурсивный, линейный поиск с использованием вектора - C++
Изучаю C++ по книжке Дейтелов "Как прогарммировать на C++". Попалась задача на рекурсию: "(Поиск наименьшего значения в массиве) Напишите...

Нужны небольшие пояснения по маленькому фрагменту кода, реализующего рекурсивный поиск в глубину по графу - C++
Здравствуйте, не могу разобраться в этой функции. Ниже есть ссылка на сам алгоритм. Заранее спасибо. Тут описан алгоритм. vector <...

Считать одномерный массив с файла, отсортировать его использую рекурсивный вызов функции - 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");
Убежденный
Системный программист
Эксперт С++
15248 / 6880 / 1092
Регистрация: 02.05.2013
Сообщений: 11,262
Завершенные тесты: 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     Рекурсивный поиск файла. Падаю
Ответ Создать тему
Опции темы

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