Здравствуйте, Dimon4ik.
С некоторыми усилиями написала пример в Borland-е (не люблю я его), у меня отрабатывает корректно. Я сделала поиск заданного файла в папке и всех её подпапках в глубину, если Вам нужно только первый уровень рассмотреть, просто уберите рекурсию или ограничьте её одним заходом. Для поиска по папке я воспользовалась WinAPI-функциями FindFirstFile, FindNextFile, FindClose.
Функция FindFirstFile создаёт описатель "поиск" (возвращаемое значение) и начинает поиск файлов и папок в заданной директории, соответствующих определённой маске. Продолжать поиск следует через функцию FindNextFile, которая работает с уже существующим описателем и возвращает bool-значение, показывающее, найдено ли ещё что-то в директории. После окончания поиска его следует закрыть функцией FindClose.
HANDLE FindFirstFile(
LPCTSTR lpFileName, //Директория для поиска и маска, по которой следует отбирать найденное
LPWIN32_FIND_DATA lpFindFileData //Информация о найденном файле/папке
);BOOL FindNextFile(
HANDLE hFindFile, //Описатель, созданный FindFirstFile
LPWIN32_FIND_DATA lpFindFileData //Информация о найденном файле/папке
);BOOL FindClose(
HANDLE hFindFile //Описатель, созданный FindFirstFile
);lpFileName - здесь передаётся существующий путь и имя файла (или маска), т.е. после указания пути можно задать фильтр поиска при помощи символов '*' (любое количество любых символов) и '?' (один любой символ). Например, для поиска всех файлов можно задать маску *.* - любое имя файла с любым расширением (в данном случае фильтр также пройдут . и .. - указатели на родительскую и корневую директории).
lpFindFileData - указатель на структуру WIN32_FIND_DATA следующего вида:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //Аттрибуты файла
FILETIME ftCreationTime; //Время создания
FILETIME ftLastAccessTime; //Время последнего открытия
FILETIME ftLastWriteTime; //Время последней записи
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[MAX_PATH]; //Имя файла
TCHAR cAlternateFileName[14]; //Альтернативное имя файла
} WIN32_FIND_DATA, *PWIN32_FIND_DATA; Это возвращаемое значение, из этой структуры мы можем получить всю необходимую информацию о найденном файле или папке. К тому же, по первому полю этой структуры (dwFileAttributes) мы можем узнать, к примеру, файл или папку мы нашли.
Можно почитать об этом в MSDN:
FindFirstFile,
FindNextFile,
FindClose.
Код в приложении, всё должно быть ясно из комментариев.
Удачи!
PS:
WinAPI - грубо говоря, набор базовых функций для приложений под Windows.
Приложение:
//---------------------------------------------------------------------------
#include <windows.h>
#include <iostream.h>
#include <conio.h>
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
bool g_bStop; //Флаг останова (можно и без него, но лучше подстраховаться)
char g_strInFolder [MAX_PATH], g_strSrchFileName[50]; //Папка и файл
void RecFind(char* pPath, WIN32_FIND_DATA fd) //Рекурсивная функция хождения по подпапкам
{
char* pPathRec=new char [MAX_PATH];
strcpy (pPathRec, pPath);
HANDLE hFindFile= FindFirstFile (strcat(pPathRec, "\\*"), &fd); //Вызываем поиск всех файлов и папок в заданной подпапке
BOOL bContinue=(hFindFile!= INVALID_HANDLE_VALUE); //Проверяем, запустилось ли
while (bContinue)
{
if(g_bStop) //Если рекурсия где-то прервалась, то и здесь выходим
{
FindClose(hFindFile); //Не забываем закрывать поиск
return;
}
if ((fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==0) //если не директория
{
if (strcmp (fd.cFileName, g_strSrchFileName)==0) { //Сравнимаем с именем файла
cout << "File is found: "; //Выводим сообщение
cout << pPath;
g_bStop = true; //Устанавливаем флаг остановки
return;
}
}
else //если же директория
{
if(fd.cFileName[0]!='.') //Если найдена не ссылка на текущую или верхнюю директорию
{
strcpy (pPathRec, pPath); //Вызываем рекурсию для директории
strcat (pPathRec, "\");
strcat (pPathRec, fd.cFileName);
RecFind(pPathRec,fd);
}
}
bContinue= FindNextFile(hFindFile, &fd); //Ищем следующий файл
}//while (bContinue)
delete [] pPathRec; //Чистим память
FindClose(hFindFile); //Закрываем поиск
}
#pragma argsused
int main(int argc, char* argv[])
{
g_bStop = false;
cin >> g_strInFolder;
cin >> g_strSrchFileName;
WIN32_FIND_DATA fd;
memset(&fd,0,sizeof(fd));
RecFind (g_strInFolder, fd);
getch();
return 0;
}
//---------------------------------------------------------------------------