Извлечение и изменение атрибутов файла
Приложение может извлечь атрибуты файла, используя функцию 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); } |