Клуб сисадминов
22:09 09.02.2012
Приветствуем, Гость | Регистрация \ Вход | Ваш IP: 38.107.179.209 | RSS
 
Знаете ли вы: можно увидеть все устройства, когда-либо подключенные к системе
[Главная · Последние сообщения · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Программное обеспечение » Программирование » С++
С++
TommiДата: 21:05 24.07.2008 | Сообщение # 1
Модератор
Сообщений: 215
Награды: 8
Статус: не в сети
С помощью какой функции на C++ можно организовать поиск файлов с определенным расширением(.dat, .doc, .htm и тп)?
 
IwanSДата: 07:51 25.07.2008 | Сообщение # 2
Администратор
Сообщений: 1849
Статус: не в сети
Code
BOOL SearchFiles(
          LPCTSTR lpszFileName,                // Директория и маска файлов для поиска
          LPSEARCHFUNC lpSearchFunc,            // Функция, вызываемая для всех найденных файлов.
          BOOL bInnerFolders /* = TRUE */)    // TRUE - поиск в подпапках.   
                     // FALSE - поиск только в заданной папке

Code
typedef void (*LPSEARCHFUNC)(LPCTSTR lpszFileName);

BOOL SearchFiles(LPCTSTR lpszFileName, LPSEARCHFUNC lpSearchFunc, BOOL bInnerFolders = TRUE)
{
      LPTSTR part;
     char tmp[MAX_PATH]; // временный массив
      char name[MAX_PATH];

     HANDLE hSearch = NULL;
     WIN32_FIND_DATA wfd;
      memset(&wfd, 0, sizeof(WIN32_FIND_DATA));

      // сначало поиск внутри вложенных папках ...
      if(bInnerFolders)
      {
          if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE;
          strcpy(name, part);
          strcpy(part, "*.*");

          // если папки существуют, то делаем поиск
          wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
          if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
          do
          {
              // в каждой папке есть две папки с именами "." и ".."
              // и эти папки мы не трогаем

              // пропускаем папки "." и ".."
              if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2))              
             continue;
           
              if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку
              {
                  char next[MAX_PATH];
                  if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE;
                  strcpy(part, wfd.cFileName);
                  strcat(next, "\\");
                  strcat(next, name);

                  SearchFiles(next, lpSearchFunc, TRUE);
              }
          }
          while (FindNextFile(hSearch, &wfd)); // ищем следующий файл

          FindClose (hSearch); // заканчиваем поиск
      }

     if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE)   
         return TRUE; // в противном случае выходим
     do
     if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // если мы нашли файл
     {
          char file[MAX_PATH];
          if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE;
          strcpy(part, wfd.cFileName);

          lpSearchFunc(file);
     }
     while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
     FindClose (hSearch); // заканчиваем поиск

      return TRUE;
}

Пример 1.
Поиск всех файлов с расширением txt в папке "C:\Dir1" и вложенных в нее папках.

Code
SearchFiles("C:\Dir1\*.txt", DoSomething, TRUE);

Пример 2.
Поиск всех файлов с именем name и любым расширением только в папке "C:\Dir1"

Code
SearchFiles("C:\Dir1\name.*", DoSomething, FALSE);  
// Пример функции DoSomething
void DoSomething(LPCTSTR lpszFileName)
{
      MessageBox(NULL, lpszFileName, "Find File", MB_OK | MB_APPLMODAL);
}

Взято отсюда.

 
TommiДата: 08:11 25.07.2008 | Сообщение # 3
Модератор
Сообщений: 215
Награды: 8
Статус: не в сети
О, спасибо большое, сейчас буду разбираться.
 
SantAlexДата: 13:43 26.07.2008 | Сообщение # 4
Администратор
Сообщений: 39
Статус: не в сети
Блин, а чего так на WIN32 всё заточено? wacko
Что, уже простых функций классического Си не хватает? biggrin
 
IwanSДата: 14:58 26.07.2008 | Сообщение # 5
Администратор
Сообщений: 1849
Статус: не в сети
SantAlex, findfirstfile и findnextfile там и используются, только они красиво оформлены.
 
DisconnecterДата: 20:02 25.01.2009 | Сообщение # 6
А Р }{ А Н Г Е Л
Сообщений: 219
Награды: 2
Статус: не в сети
Книжонки для чайников на С++ есть??? нужны.. нечем заняться, попробую подучитися:)
воощем что есть, поделитесь:)

Жду ...
За ранее спасибо ..


Я люблю задавать вопросы.. отвечая на которые вы становитесь умнее
 
REsearchДата: 20:49 25.01.2009 | Сообщение # 7
Сисадмин
Сообщений: 968
Награды: 11
Статус: не в сети
Есть у меня небольшой самоучитель для новичков, собственно, вот :
Прикрепления: 0715979.rar(1318Kb)


Изменил REsearch - Воскресенье, 25.01.2009, 21:03
 
TommiДата: 10:08 13.02.2009 | Сообщение # 8
Модератор
Сообщений: 215
Награды: 8
Статус: не в сети
REsearch, это же на Си.
 
Форум » Программное обеспечение » Программирование » С++
Страница 1 из 11
Поиск:

© Иван Собакарь, 2004 - 2012 | Сайт управляется системой uCoz