| 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 всё заточено? Что, уже простых функций классического Си не хватает?
|
| |
| |
| 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
Статус: не в сети
| Есть у меня небольшой самоучитель для новичков, собственно, вот :
Изменил REsearch - Воскресенье, 25.01.2009, 21:03
|
|
| |
| |
| Tommi | Дата: 10:08 13.02.2009 | Сообщение # 8 |
Модератор
Сообщений: 215
Награды: 8
Статус: не в сети
| REsearch, это же на Си.
|
|
| |
| |