Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
9 / 9 / 3
Регистрация: 11.12.2012
Сообщений: 152

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

31.12.2013, 21:24. Показов 1817. Ответов 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 отрабатывает, но возвращает пустую строку, хотя файлы есть

подозрений немного, но все не в тему. Единственное, что имеет право на существование - это, возможно, проблема с правами и доступом, но характер ошибки вылетающий смущает. Заранее благодарю
Миниатюры
Рекурсивный поиск файла. Падаю  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.12.2013, 21:24
Ответы с готовыми решениями:

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

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

рекурсивный поиск файлов
Всем привет! Нажно реализовать поиск файлов по маске. Набрасал вот такой код: int search_file(string disk, string mask) { char...

2
9 / 9 / 3
Регистрация: 11.12.2012
Сообщений: 152
31.12.2013, 21:34  [ТС]
если в файл в 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");
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
01.01.2014, 12:51
Да тут ошибка чуть ли не в каждой строке кода.

Цитата Сообщение от 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, что вернет функция ?
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.01.2014, 12:51
Помогаю со студенческими работами здесь

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

Помогите зациклить рекурсивный поиск
Помогите зациклить поиск(пока работает для 2 список, если их больше не работает), вот часть кода ...

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru