Udostępnij przez


Pobieranie i zmienianie atrybutów pliku

Aplikacja może pobrać atrybuty pliku przy użyciu funkcji GetFileAttributes lub GetFileAttributesEx. Funkcje CreateFile i SetFileAttributes mogą ustawiać wiele atrybutów. Jednak aplikacje nie mogą ustawić wszystkich atrybutów.

Przykład kodu w tym temacie używa funkcji CopyFile do kopiowania wszystkich plików tekstowych (.txt) w bieżącym katalogu do nowego katalogu plików tylko do odczytu. W razie potrzeby pliki w nowym katalogu są zmieniane na tylko do odczytu.

Aplikacja tworzy katalog określony jako parametr przy użyciu funkcji CreateDirectory. Katalog nie może już istnieć.

Aplikacja wyszukuje bieżący katalog dla wszystkich plików tekstowych przy użyciu funkcji FindFirstFile i FindNextFile. Każdy plik tekstowy jest kopiowany do katalogu \TextRO. Po skopiowaniu pliku funkcja GetFileAttributes określa, czy plik jest tylko do odczytu. Jeśli plik nie jest tylko do odczytu, aplikacja zmienia katalogi na \TextRO i konwertuje skopiowany plik na tylko do odczytu przy użyciu funkcji SetFileAttributes.

Po skopiowaniu wszystkich plików tekstowych w bieżącym katalogu aplikacja zamyka dojście wyszukiwania przy użyciu funkcji 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);
}

Stałe atrybutu pliku

Nazwy plików, ścieżki i przestrzenie nazw