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

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

Константы атрибутов файлов

Имена файлов, пути и пространства имен