Получение и изменение атрибутов файла
Приложение может получить атрибуты файла с помощью функции GetFileAttributes или GetFileAttributesEx . Функции CreateFile и SetFileAttributes могут задавать многие атрибуты. Однако приложения не могут задать все атрибуты.
В примере кода в этом разделе используется функция CopyFile для копирования всех текстовых файлов (.txt) в текущем каталоге в новый каталог файлов, доступных только для чтения. При необходимости файлы в новом каталоге будут изменены на только для чтения.
Приложение создает каталог, указанный в качестве параметра, с помощью функции CreateDirectory . Каталог еще не должен существовать.
Приложение выполняет поиск всех текстовых файлов в текущем каталоге с помощью функций FindFirstFile и FindNextFile . Каждый текстовый файл копируется в каталог \TextRO. После копирования файла функция GetFileAttributes определяет, доступен ли файл только для чтения. Если файл не только для чтения, приложение изменяет каталоги на \TextRO и преобразует скопированный файл в режим только для чтения с помощью функции SetFileAttributes .
После копирования всех текстовых файлов в текущем каталоге приложение закрывает дескриптор поиска с помощью функции FindClose .
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>
void _tmain(int argc, TCHAR* argv[])
{
WIN32_FIND_DATA FileData;
HANDLE hSearch;
DWORD dwAttrs;
TCHAR szNewPath[MAX_PATH];
BOOL fFinished = FALSE;
if(argc != 2)
{
_tprintf(TEXT("Usage: %s <dir>\n"), argv[0]);
return;
}
// Create a new directory.
if (!CreateDirectory(argv[1], NULL))
{
printf("CreateDirectory failed (%d)\n", GetLastError());
return;
}
// Start searching for text files in the current directory.
hSearch = FindFirstFile(TEXT("*.txt"), &FileData);
if (hSearch == INVALID_HANDLE_VALUE)
{
printf("No text files found.\n");
return;
}
// Copy each .TXT file to the new directory
// and change it to read only, if not already.
while (!fFinished)
{
StringCchPrintf(szNewPath, sizeof(szNewPath)/sizeof(szNewPath[0]), TEXT("%s\\%s"), argv[1], FileData.cFileName);
if (CopyFile(FileData.cFileName, szNewPath, FALSE))
{
dwAttrs = GetFileAttributes(FileData.cFileName);
if (dwAttrs==INVALID_FILE_ATTRIBUTES) 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)
{
_tprintf(TEXT("Copied *.txt to %s\n"), argv[1]);
fFinished = TRUE;
}
else
{
printf("Could not find next file.\n");
return;
}
}
}
// Close the search handle.
FindClose(hSearch);
}
Связанные темы