Извлечение и изменение атрибутов файла
Приложение может извлечь атрибуты файла, используя функцию GetFileAttributes или GetFileAttributesEx. Функции CreateFile и SetFileAttributes могут установить многие из атрибутов. Однако, прикладные программы не могут установить все атрибуты.
Пример ниже использует функцию CopyFile, чтобы копировать все текстовые файлы (.txt) в текущем каталоге, в новый каталог файлов только для чтения, названный \TextRO. Файлы в новом каталоге, если необходимо, изменяются в файлы только для чтения.
Приложение создает каталог \TextRO, используя функцию CreateDirectory.
Прикладная программа ищет в текущем каталог все текстовые файлы, используя функции FindFirstFile и FindNextFile. Каждый текстовый файл копируется в каталог \TextRO. После того, как файл скопируется, функция GetFileAttributes выясняет, является ли этот файл - файлом только для чтения. Если этот файл - не только для чтения, приложение изменяет каталоги в \TextRO и преобразует скопированный файл в файл только для чтения, используя функцию SetFileAttributes.
После того, как все текстовые файлы в текущем каталоге будут скопированы, приложение закрывает дескриптор поиска, используя функцию FindClose.
#include <windows.h>
#include <stdio.h>
void main()
{
WIN32_FIND_DATA FileData;
HANDLE hSearch;
DWORD dwAttrs;
TCHAR szDirPath[] = TEXT("c:\\TextRO\\");
TCHAR szNewPath[MAX_PATH];
BOOL fFinished = FALSE;
// Создаем новый каталог.
if (!CreateDirectory(szDirPath, NULL))
{
printf("Could not create new directory.\n");
return;
}
// Начинаем поиск текстовых файлов в текущем каталоге.
hSearch = FindFirstFile(TEXT("*.txt"), &FileData);
if (hSearch == INVALID_HANDLE_VALUE)
{
printf("No text files found.\n");
return;
}
// Копируем каждый .TXT файл в новый каталог
// и изменяем его в "только для чтения", если этого нет.
while (!fFinished)
{
lstrcpy(szNewPath, szDirPath);
lstrcat(szNewPath, FileData.cFileName);
if (CopyFile(FileData.cFileName, szNewPath, FALSE))
{
dwAttrs = GetFileAttributes(FileData.cFileName);
if( GetLastError() != 0 ) return;
if (!(dwAttrs & FILE_ATTRIBUTE_READONLY))
{
SetFileAttributes(szNewPath,
dwAttrs | FILE_ATTRIBUTE_READONLY);
}
}
else
{
printf("Could not copy file.\n");
return;
}
if (!FindNextFile(hSearch, &FileData))
{
if (GetLastError() == ERROR_NO_MORE_FILES)
{
printf("Copied all text files.\n");
fFinished = TRUE;
}
else
{
printf("Could not find next file.\n");
return;
}
}
}
// Закрываем дескриптор поиска.
FindClose(hSearch);
}
|