4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137

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

20.08.2016, 19:38. Показов 3362. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!
Пишу программу, имеющую функционал поиска файлов по ключевым словам. Для начала написал программу, которая перебирала бы дескрипторы всех файлов на всех логических дисках.

Получилось у меня следующее:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <Windows.h>
 
WIN32_FIND_DATA findData;
 
char path[261];
 
void fileProcess()
{
    OFSTRUCT ofstruct;
 
    HANDLE file = (HANDLE)OpenFile(findData.cFileName, &ofstruct, OF_READWRITE);
 
    CloseHandle(file);
}
 
void RecursiveSearch()
{
    char *lastChar = path + lstrlen(path);
 
    lstrcat(path, "*");
 
    HANDLE find = FindFirstFile(path, &findData);
 
    *lastChar = '\0';
 
    MessageBox(0, path, "current path", 0); // СТРОКА ДЛЯ ОТЛАДКИ! Выводит текущий путь.
 
    do
    {
        MessageBox(0, findData.cFileName, "founded", 0); // СТРОКА ДЛЯ ОТЛАДКИ! Выводит последний найденный файл.
 
        if ((0 == lstrcmp(findData.cFileName, ".")) || (0 == lstrcmp(findData.cFileName, ".."))) continue;
 
        if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            lstrcat(path, findData.cFileName);
            lstrcat(path, "");
            RecursiveSearch();
        }
        else fileProcess();
 
        *lastChar = '\0';
 
        MessageBox(0, path, "Вышел из рекурсии", 0); // СТРОКА ДЛЯ ОТЛАДКИ! Путь после выхода из витка рекурсии.
    } while (FindNextFile(find, &findData));
 
    FindClose(find);
}
 
void FindFiles()
{
    char curDrive[] = "A:\\";
    DWORD DiskMask = GetLogicalDrives();
 
    for (int i = 0; i < 26; i++) {
        if (DiskMask & 1) {
            lstrcpy(path, curDrive);
 
            RecursiveSearch();
        }
        DiskMask >>= 1;
        curDrive[0]++;
    }
}
 
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    memset(path, 0, 261);
    FindFiles();
 
    return 0;
}
Если что-то не понятно из логики кода - пишите, я поясню.
В общем, запускаю программу и читаю свои отладочные сообщения. Из них следует, что сначала на диске C находится папка $Recycle.Bin, в ней папка, название которой состоит из кучи букв и цифр (штук 30 символов), а в ней файл desktop.ini. Хорошо. Далее происходит поэтапный выход из рекурсии аж до диска C, где находится папка Documents and Settings. Далее начинается кромешное веселье - в папке C:\Documents and Settings\ находится Documents and Settings, в ней тоже находится Documents and Settings и так до бесконечности приходят сообщения о том, что текущий путь:

C:\Documents and Settings\Documents and Settings\Documents and Settings\Documents and Settings\Documents and Settings\Documents and Settings\Documents and Settings\Documents and Settings\Documents and Settings\Documents and Settings\Documents and Settings\Documents and Settings\Documents and Settings\Documents and Settings\

Я долго пытался что-то анализировать и вообще ничего не понял. Если ошибка в алгоритме (а я её искал, вроде как её нет), то почему тогда папка $Recycle.Bin обследуется правильным образом? Возможно ошибка в правах доступа (я не могу получить доступ к папке C:\Documents and Settings через проводник), но почему она ломает алгоритм и как это починить я тоже не пойму.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.08.2016, 19:38
Ответы с готовыми решениями:

Рекурсивный поиск файлов
Доброго времени суток. Нужна помощь есть код который вполне подходит мне он ищет диски на компе потом в каждом диске ищет файлы по маске,...

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

Рекурсивный поиск файлов в подкаталогах
В общем имеется программа,которая перед каждым именем файла вставляет его порядковый номер и работает только с одним каталогом. Как сделать...

6
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
20.08.2016, 22:13
CreateFile нужно использовать вместо OpenFile. Там же и права доступа в ней указать можно. А еще я бы попробовал запустить прогу от имени администратора, но также с функой CreateFile.
0
4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137
20.08.2016, 22:46  [ТС]
Цитата Сообщение от Digit@ll Посмотреть сообщение
CreateFile нужно использовать вместо OpenFile
К функции OpenFile у меня, пока, претензий нет. В других контекстах она своё предназначение отрабатывает отлично. В данном же примере можно и OpenFile и CloseFile совсем убрать. Проблема от этого не изменится)
0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
21.08.2016, 00:18
Похоже, путь у вас неверно конструируется. Лень вникать, возьмите готовый код (два разных класса).
Вложения
Тип файла: 7z file_find.7z (3.1 Кб, 70 просмотров)
0
4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137
21.08.2016, 00:36  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
возьмите готовый код
Это классы именно для перебора всех файлов?.. А не расскажите кратенько, как ими пользоваться?)
0
21.08.2016, 01:10

Не по теме:

Nell_core, где ж отлично, у меня она еще на $Recycle.Bin спотыкается и начинает плести портянку.

0
3176 / 1935 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
21.08.2016, 01:31
Цитата Сообщение от Nell_core Посмотреть сообщение
кратенько
Примерно так:
FindFile (нерекурсивный поиск в директории)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
int main(int argc,char** argv)
{
   if (argc > 2)
   {
      ShowHelp();
      return 0;
   }
 
   FindFile*   pFF = new FindFile;
 
   if (!pFF)
   {
      return -1;
   }
 
   if (argc == 2)
   {
      if ((!strcmp(argv[1],"?")) || (!strcmp(argv[1],"/?")) || (!strcmp(argv[1],"-?")) || (!stricmp(argv[1],"/h")) || (!stricmp(argv[1],"-h")))
      {
         ShowHelp();
         return 0;
      }
 
      pFF->SetMask(argv[1]);
   }
   else
   {
      pFF->SetMask("*.*");
   }
 
   while (pFF->Fetch())
   {
      if ((pFF->_w32fd.dwFileAttributes | FILE_ATTRIBUTE_NORMAL) && !(pFF->_w32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
      {
         ProceedSingleFile(pFF->_w32fd);
      }
   }
 
   delete pFF;
   pFF = NULL;
 
   return 0;
}

Walker ([опционально] рекурсивный поиск)
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
30
31
32
33
34
35
36
37
static void ForEach(const char* const pszFileName)
{  
}
 
int main(int argc,char** argv)
{
   char     pszMask[MAX_PATH + 1];
   
   memset(pszMask,0,sizeof(pszMask));
   
   strncpy(pszMask,argv[1],MAX_PATH);
   pszMask[MAX_PATH] = 0; // Ensure ASCIIZ
   
   char     pszDrive   [_MAX_DRIVE];
   char     pszDir     [_MAX_DIR];
   char     pszFName   [_MAX_FNAME];
   char     pszExt     [_MAX_EXT];
   
   _splitpath(pszMask,pszDrive,pszDir,pszFName,pszExt);
   
   char     pszSrchMask[MAX_PATH + 1];
   char     pszSrchPath[MAX_PATH + 1];
   
   strcpy(pszSrchMask,pszFName);
   strcat(pszSrchMask,pszExt);
   
   Walker      Visitor;
 
   Visitor.Init(ForEach,pszSrchMask,true);
 
   strcpy(pszSrchPath,pszDrive);
   strcat(pszSrchPath,pszDir);
 
   Visitor.Run(*pszSrchPath  ?  pszSrchPath  :  ".");
   
   return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.08.2016, 01:31
Помогаю со студенческими работами здесь

Рекурсивный поиск файлов пропускает UNICODE имена
Помогите, прошу вас! void searchFiles(const char * dirn) { char dirnPath; sprintf(dirnPath, &quot;%s\\*&quot;, dirn); ...

Рекурсивный поиск файлов заполняет не выгруженный пул памяти Си WINAPI
Приветствую,джентельмены. Пытаюсь выполнить поиск файлов на локальном диске,включая файлы во всех каталогах. Использовал для этого...

Рекурсивный поиск файлов однозначно должен приводить к краху программы
При поиске файлов в папках и подпапках, всегда в примерах используется метод FindFirstFile, FindNextFile с дальнейшей рекурсией. Есть...

Рекурсивный вывод всех папок и файлов
Господа казалось бы банальный вопрос , но что то я упёрся !!! Вообщем делаю функцию которая показывает все папки и файлы в этих папках ,...

FindFirstFile и FindNextFile рекурсивный поиск файла
Как безопасно (без всевозможных переполнений и высвобождением ресурсов) реализовать рекурсивный поиск файла на одном из разделов диска? Или...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
EmBitz, создание проекта, отладка, прошивка
locm 15.07.2025
Создание проекта для Blue Pill (STM32F103C8T6) в EmBitz 2. 30, написания кода blink, запуск отладки в ОЗУ, заливка релизной прошивки во flash используя ST-Link и др. . . .
Трассировка корутин Kotlin с OpenTelemetry
mobDevWorks 14.07.2025
Асинхронное программирование меняет правила игры, особенно когда речь заходит о трассировке операций. В Kotlin с его корутинами эта проблема приобретает особый оттенок, который я хотел бы детально. . .
Облачные приложения на Rust: руководство по архитектуре микросервисов
golander 13.07.2025
Когда я впервые взялся за проектирование облачной платформы для одного из наших клиентов, выбор стоял между привычными Go и Java. Но после нескольких месяцев разработки микросервисной системы,. . .
Как Node.js выполняет асинхронные операции
Reangularity 13.07.2025
Каждый раз, когда я рассказываю про Node. js, возникает один и тот же вопрос: "Как эта штука может быть быстрой, если JavaScript — однопоточный язык?" И это действительно кажется парадоксом. Ведь в. . .
Как писать чистый, тестируемый и качественный код на Python
py-thonny 12.07.2025
Помню свой первый проект на Python. Работал тогда быстро, грязно, лишь бы работало. Код был похож на запутанный клубок - переменные по одной букве, функции на 200 строк, комментарии отсутствовали как. . .
Blazor и контроллер сервопривода IoT Meadow Maple
Wired 11.07.2025
Я решил разобраться, как можно соединить современные веб-технологии с миром "железа". Интересная комбинация получилась из Blazor в качестве веб-интерфейса и микроконтроллера Meadow с его веб-сервером. . .
Генерация OpenQASM из кода Q#
EggHead 10.07.2025
Летом 2024-го я начал эксперименты с библиотекой Q# Bridge, и знаете что? Она оказалась просто находкой для тех, кто работает на стыке разных квантовых экосистем. Основная фишка этой библиотеки -. . .
Изучаем новый шаблон ИИ-чата .NET AI Chat Web App
stackOverflow 10.07.2025
В . NET появилось интересное обновление - новый шаблон ИИ-чата под названием . NET AI Chat Web App. Когда я впервые наткнулся на анонс этого шаблона, то сразу понял, что Microsoft наконец-то. . .
Результаты исследования от команды ARP (июль 2025 г.)
Programma_Boinc 10.07.2025
Результаты исследования от команды ARP (июль 2025 г. ) Африканский проект по дождям (ARP) World Community Grid снова запущен! Мы рады поделиться обновленной информацией о нашем прогрессе с осени. . .
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru