15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Поиск файлов и изменение атрибутов.

Следующий пример копирует все текстовые файлы из текущей директории в новую директорию с именем \TEXTRO. При необходимости, файлам в новой директории присваивается атрибут "только чтение".

Директория \TEXTRO создаётся функцией CreateDirectory.

Поиск всех файлов .TXT в текущей директории производится функциями FindFirstFile и FindNextFile. Каждый файл .TXT копируется в директорию \TEXTRO. После того, как файл скопирован, функция GetFileAttributes проверяет, является ли файл только для чтения. Если аттрибута "только чтение" у файла не установлено, то приложение устанавливает этот атрибут функцией SetFileAttributes.

После того, как все файлы .TXT из текущей директории были скопированы, то хэндл поиска закрывается функцией FindClose.

#include <windows.h>
#include <stdio.h>

WIN32_FIND_DATA FileData;
HANDLE hSearch;
DWORD dwAttrs;
char szDirPath[] = "c:\\TEXTRO\\";
char szNewPath[MAX_PATH];
char szHome[MAX_PATH];

BOOL fFinished = FALSE;

// Создаём новую директорию.
 
if (!CreateDirectory(szDirPath, NULL))
{
    printf("Couldn't create new directory.");
    return;
}

// Начинаем поиск файлов .TXT в текущей директории.
 
hSearch = FindFirstFile("*.txt", &FileData);
if (hSearch == INVALID_HANDLE_VALUE)
{
    printf("No .TXT files found.");
    return;
}

// Копируем каждый файл .TXT в новую директорию и изменяем его
// атрибут на "только чтение", если он уже не установлен.
 
while (!fFinished)
{
    lstrcpy(szNewPath, szDirPath);
    lstrcat(szNewPath, FileData.cFileName);
    if (CopyFile(FileData.cFileName, szNewPath, FALSE))
    {
        dwAttrs = GetFileAttributes(FileData.cFileName);
        if (!(dwAttrs & FILE_ATTRIBUTE_READONLY))
        {
            SetFileAttributes(szNewPath,
                dwAttrs | FILE_ATTRIBUTE_READONLY);
        }
    }
    else
    {
        printf("Couldn't copy file.");
        return;
    }

    if (!FindNextFile(hSearch, &FileData))
    {
        if (GetLastError() == ERROR_NO_MORE_FILES)
        {
            MessageBox(hwnd, "No more .TXT files.",
                "Search completed.", MB_OK);
            fFinished = TRUE;
        }
        else
        {
            printf("Couldn't find next file.");
            return;
        }
    }
}

// Закрываем хэндл поиска.

FindClose(hSearch);