Перейти к содержимому

Поиск файлов в текущей директории

Иногда бывают ситуации, когда необходимо произвести поиск файлов в текущей директории, то есть в папке, из которой был произведен запуск программы. Чтобы начать поиск необходима API функция FindFirstFile:

HANDLE FindFirstFile(LPCTSTR lpFileName,
//имя файла(ов) который(е) ищем, можно использовать маску (*,?)
LPWIN32_FIND_DATA lpFindFileData);
//структура которая будет содержит информацию о файле

Если произошла ошибка, то функция вернет значение INVALID_HANDLE_VALUE, иначе handle поиска.
Структура WIN32_FIND_DATA содержит следующие элементы:

dwFileAttributes – атрибуты файла(директории):
FILE_ATTRIBUTE_ARCHIVE 0x00000020 файл или директория архивные
FILE_ATTRIBUTE_COMPRESSED 0x00000800 файл или директория сжаты
FILE_ATTRIBUTE_DIRECTORY 0x00000010 каталог
FILE_ATTRIBUTE_ENCRYPTED 0x00000040 файл или директория зашифрованы
FILE_ATTRIBUTE_HIDDEN 0x00000002 файл или директория скрыты
FILE_ATTRIBUTE_NORMAL 0x00000080 файл или директория без атрибутов
FILE_ATTRIBUTE_READONLY 0x00000001 только чтение
FILE_ATTRIBUTE_SYSTEM 0x00000004 файл или директория системные
FILE_ATTRIBUTE_TEMPORARY 0x00000100 файл или директория временные

ftCreationTime – время создания
ftLastAccessTime – время последнего открытия
ftLastWriteTime – время последнего изменения
nFileSizeLow – размер файла
cFileName – имя файла

Для продолжения поиска необходима функция FindNextFile:

BOOL FindNextFile( HANDLE hFindFile,
//handle поиска
LPWIN32_FIND_DATA lpFindFileData
//указатель на структуру с информацией о файле;

Если нет ошибок функция возвращает не нулевое значение. Для нахождения текущей директории можно воспользоваться функцией GetCurrentDirectory:

DWORD GetCurrentDirectory(DWORD nBufferLength, //размер буфера
LPTSTR lpBuffer //указатель на буфер );

Теперь сам код, используется Visual C++ 6.0, создаем Win32 Console Application.

#include <iostream.h>
#include <windows.h>
 
int main()
{
    WIN32_FIND_DATA winFileData;
    HANDLE hFile;
    char szPath[MAX_PATH];
    if(GetCurrentDirectory(sizeof(szPath),szPath))
    {
         cout<<szPath<<endl;
         lstrcat(szPath,"\\*.*");
         hFile = FindFirstFile(szPath,&winFileData);
         if (hFile!=INVALID_HANDLE_VALUE)
         {
             do
             {
                   cout<<winFileData.cFileName<<endl;            
             }
             while (FindNextFile(hFile,&winFileData)!=0);
             FindClose(hFile);
          }
    }
    return 0;
}
Метки: