ファイル

ファイルのオープン

CreateFile

ファイルを作成または開き、そのファイルへアクセスするためのハンドルを取得できます。

HANDLE CreateFile(
  LPCTSTR lpFileName,                         // ファイル名
  DWORD dwDesiredAccess,                      // アクセスモード
  DWORD dwShareMode,                          // 共有モード
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // セキュリティ記述子
  DWORD dwCreationDisposition,                // 作成方法
  DWORD dwFlagsAndAttributes,                 // ファイル属性
  HANDLE hTemplateFile                        // テンプレートファイルのハンドル
  );
CreateFile 関数 | MSDN CreateFileW function | Microsoft Docs

この関数には文字コードによって、次の2種類があります。

  • Unicode版 … CreateFileW
  • ANSI版 … CreateFileA
アクセスモード
 
GENERIC_READ 読み込み
GENERIC_WRITE 書き込み
共有モード
   
FILE_SHARE_DELETE  
FILE_SHARE_READ  
FILE_SHARE_WRITE  

ファイルが存在しないときの挙動は、dwCreationDispositionの値によります。

作成方法
   
CREATE_ALWAYS  
CREATE_NEW  
OPEN_ALWAYS  
OPEN_EXISTING  
TRUNCATE_EXISTING  

書き込み

BOOL WriteFile(
  HANDLE       hFile,
  LPCVOID      lpBuffer,
  DWORD        nNumberOfBytesToWrite,
  LPDWORD      lpNumberOfBytesWritten,
  LPOVERLAPPED lpOverlapped
);
WriteFile function | Microsoft Docs
int lpBuffer[] = { 1, 2, 3 };
const WCHAR* lpFileName = L"C:\\sample.bin";

HANDLE hFile = CreateFile(
    lpFileName,
    GENERIC_WRITE,
    FILE_SHARE_READ,
    NULL,
    CREATE_ALWAYS,
    0,
    NULL
);

DWORD nNumberOfBytesToWrite = sizeof(lpBuffer);
DWORD lpNumberOfBytesWritten;

BOOL bResult = WriteFile(
    hFile,
    lpBuffer,
    nNumberOfBytesToWrite,
    &lpNumberOfBytesWritten,
    NULL
);

CloseHandle(hFile);

ファイルの属性

GetFileAttributes

ファイルの属性を取得できます。

DWORD WINAPI GetFileAttributes(
  _In_ LPCTSTR lpFileName
);
GetFileAttributes function (Windows) | MSDN GetFileAttributes 関数 | MSDN
LPCTSTR path = L"C:\\sample.txt";
DWORD attributes = GetFileAttributes(path);

結果は、下表の定数を含む値で返されます。

定数 属性名 説明
FILE_ATTRIBUTE_ARCHIVE 32 (0x20) A アーカイブ属性
FILE_ATTRIBUTE_COMPRESSED 2048 (0x800) C 圧縮属性
FILE_ATTRIBUTE_DEVICE 64 (0x40)   (システムが利用するために予約)
FILE_ATTRIBUTE_DIRECTORY 16 (0x10) D ディレクトリ (フォルダ) 属性
FILE_ATTRIBUTE_ENCRYPTED 16384 (0x4000) E 暗号化属性
FILE_ATTRIBUTE_HIDDEN 2 (0x2) H 隠しファイル属性
FILE_ATTRIBUTE_INTEGRITY_STREAM 32768 (0x8000) V 整合性属性 (ReFSボリュームのみでサポート).

Windows Server 2012より前はサポートされない

FILE_ATTRIBUTE_NORMAL 128 (0x80)   他の属性なし
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED 8192 (0x2000) I (N) 非インデックス対象ファイル属性
FILE_ATTRIBUTE_NO_SCRUB_DATA 131072 (0x20000) X スクラブ ファイルなし属性

Windows 8とWindows Server 2012より前はサポートされない

FILE_ATTRIBUTE_OFFLINE 4096 (0x1000) O オフライン属性
FILE_ATTRIBUTE_READONLY 1 (0x1) R 読み取り専用属性
FILE_ATTRIBUTE_REPARSE_POINT 1024 (0x400) L リパースポイント
FILE_ATTRIBUTE_SPARSE_FILE 512 (0x200) P スパースファイル
FILE_ATTRIBUTE_SYSTEM 4 (0x4) S システム属性
FILE_ATTRIBUTE_TEMPORARY 256 (0x100) T 一時ファイル
FILE_ATTRIBUTE_VIRTUAL 65536 (0x10000)   (システムが利用するために予約)
File Attribute Constants (Windows) | MSDN

ディレクトリかどうかの判定

LPCTSTR path = L"C:\\sample";
DWORD attributes = GetFileAttributes(path);

if (attributes == INVALID_FILE_ATTRIBUTES)
{
    // 失敗
}
else if (attributes & FILE_ATTRIBUTE_DIRECTORY)
{
    // ディレクトリ
}
else
{
    // ディレクトリ以外
}
How to check if directory exist using C++ and winAPI - Stack Overflow

GetFileAttributesEx

BOOL WINAPI GetFileAttributesEx(
  _In_  LPCTSTR                lpFileName,
  _In_  GET_FILEEX_INFO_LEVELS fInfoLevelId,
  _Out_ LPVOID                 lpFileInformation
);
GetFileAttributesEx function (Windows) | MSDN GetFileAttributesEx 関数 | MSDN
LPCTSTR path = L"C:\\sample.txt";
WIN32_FILE_ATTRIBUTE_DATA lpFileInformation;

BOOL succeed = GetFileAttributesEx(
    path,
    GET_FILEEX_INFO_LEVELS::GetFileExInfoStandard,
    &lpFileInformation);
typedef struct _WIN32_FILE_ATTRIBUTE_DATA {
  DWORD    dwFileAttributes; // 属性
  FILETIME ftCreationTime;   // 作成日時
  FILETIME ftLastAccessTime; // アクセス日時
  FILETIME ftLastWriteTime;  // 更新日時
  DWORD    nFileSizeHigh;    // サイズを表す値の上位32ビット
  DWORD    nFileSizeLow;     // サイズを表す値の下位32ビット
} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA;
WIN32_FILE_ATTRIBUTE_DATA structure (Windows) | MSDN
MSDN (Microsoft Developer Network) から検索