Récupération et modification des attributs de fichier

Une application peut récupérer les attributs de fichier à l’aide de la fonction GetFileAttributes ou GetFileAttributesEx . Les fonctions CreateFile et SetFileAttributes peuvent définir de nombreux attributs. Toutefois, les applications ne peuvent pas définir tous les attributs.

L’exemple de code de cette rubrique utilise la fonction CopyFile pour copier tous les fichiers texte (.txt) du répertoire actif vers un nouveau répertoire de fichiers en lecture seule. Les fichiers du nouveau répertoire sont modifiés en lecture seule, si nécessaire.

L’application crée le répertoire spécifié en tant que paramètre à l’aide de la fonction CreateDirectory . Le répertoire ne doit pas exister déjà.

L’application recherche tous les fichiers texte dans le répertoire actif à l’aide des fonctions FindFirstFile et FindNextFile . Chaque fichier texte est copié dans le répertoire \TextRO. Une fois un fichier copié, la fonction GetFileAttributes détermine si un fichier est en lecture seule ou non. Si le fichier n’est pas en lecture seule, l’application remplace les répertoires en \TextRO et convertit le fichier copié en lecture seule à l’aide de la fonction SetFileAttributes .

Une fois tous les fichiers texte du répertoire actif copiés, l’application ferme le handle de recherche à l’aide de la fonction 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);
}

Constantes d’attribut de fichier

Noms de fichiers, chemins d’accès et espaces de noms