ファイル属性の取得と変更

アプリケーションは、 GetFileAttributes または GetFileAttributesEx 関数を使用して、ファイル属性 取得できます。 CreateFile 関数と SetFileAttributes 関数は、多くの属性を設定できます。 ただし、アプリケーションですべての属性を設定することはできません。

このトピックのコード例では 、CopyFile 関数を使用して、現在のディレクトリ内のすべてのテキスト ファイル (.txt) を読み取り専用ファイルの新しいディレクトリにコピーします。 必要に応じて、新しいディレクトリ内のファイルが読み取り専用に変更されます。

アプリケーションは、 CreateDirectory 関数を使用して、パラメーターとして指定されたディレクトリを作成します。 ディレクトリは既に存在してはなりません。

アプリケーションは、 FindFirstFile 関数と FindNextFile 関数を使用して、現在のディレクトリですべてのテキスト ファイルを検索します。 各テキスト ファイルは \TextRO ディレクトリにコピーされます。 ファイルをコピーした後、 GetFileAttributes 関数は、ファイルが読み取り専用かどうかを判断します。 ファイルが読み取り専用でない場合、アプリケーションはディレクトリを \TextRO に変更し、コピーしたファイルを SetFileAttributes 関数を使用して読み取り専用に変換します。

現在のディレクトリ内のすべてのテキスト ファイルがコピーされると、アプリケーションは 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);
}

ファイル属性定数

ファイル名、パス、および名前空間