Recuperando e alterando atributos de arquivo

Um aplicativo pode recuperar os atributos de arquivo usando a função GetFileAttributes ou GetFileAttributesEx . As funções CreateFile e SetFileAttributes podem definir muitos dos atributos. No entanto, os aplicativos não podem definir todos os atributos.

O exemplo de código neste tópico usa a função CopyFile para copiar todos os arquivos de texto (.txt) no diretório atual para um novo diretório de arquivos somente leitura. Os arquivos no novo diretório são alterados para somente leitura, se necessário.

O aplicativo cria o diretório especificado como um parâmetro usando a função CreateDirectory . O diretório ainda não deve existir.

O aplicativo pesquisa no diretório atual todos os arquivos de texto usando as funções FindFirstFile e FindNextFile . Cada arquivo de texto é copiado para o diretório \TextRO. Depois que um arquivo é copiado, a função GetFileAttributes determina se um arquivo é somente leitura ou não. Se o arquivo não for somente leitura, o aplicativo alterará os diretórios para \TextRO e converterá o arquivo copiado para somente leitura usando a função SetFileAttributes .

Depois que todos os arquivos de texto no diretório atual forem copiados, o aplicativo fechará o identificador de pesquisa usando a função 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 arquivo

Nomes de arquivo, caminhos e namespaces