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


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

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz