Recuperar y cambiar atributos de archivo

Una aplicación puede recuperar los atributos de archivo mediante la función GetFileAttributes o GetFileAttributesEx . Las funciones CreateFile y SetFileAttributes pueden establecer muchos de los atributos. Sin embargo, las aplicaciones no pueden establecer todos los atributos.

En el ejemplo de código de este tema se usa la función CopyFile para copiar todos los archivos de texto (.txt) del directorio actual en un nuevo directorio de archivos de solo lectura. Los archivos del nuevo directorio se cambian a solo lectura, si es necesario.

La aplicación crea el directorio especificado como parámetro mediante la función CreateDirectory . El directorio aún no debe existir.

La aplicación busca en el directorio actual todos los archivos de texto mediante las funciones FindFirstFile y FindNextFile . Cada archivo de texto se copia en el directorio \TextRO. Una vez copiado un archivo, la función GetFileAttributes determina si un archivo es de solo lectura. Si el archivo no es de solo lectura, la aplicación cambia los directorios a \TextRO y convierte el archivo copiado en solo lectura mediante la función SetFileAttributes .

Una vez copiados todos los archivos de texto del directorio actual, la aplicación cierra el identificador de búsqueda mediante la función 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 de atributo de archivo

Nombres de archivo, rutas de acceso y espacios de nombres