potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

WIL GitHub Wiki ファイルシステムヘルパーの和訳・改変

MicrosoftがGitHubでMITライセンス公開しているWILのGitHub Wikiの記事を和訳・改変したものです。素人による翻訳なので、誤訳や著作権上の問題などありましたらご連絡いただけますと幸いです。

ファイルシステムヘルパー(原題:File System Helpers (filesystem.h))

Chris Guzak、2023/10/10、リビジョン3個

CreateFileWヘルパー

CreateFileWの簡単な使用では既定引数が有効です。関数は動作を制御するフラグの動作により名づけられています。

auto handle = wil::open_file(path.c_str());

「open」「create」「truncate」により既存ファイルの開放、新規作成、既存ファイルの変更を区別できます。より複雑な用例として、戻り値がハンドルとエラーコードの場合を扱います(エラーコードは成功時にも使われるので、アクセスの提供は必須です)。

auto path = wil::ExpandEnvironmentStringsW<std::wstring>(LR"(%TEMP%\create_file_test.txt)");
auto [fileHandle, error] = wil::try_create_new_file(path.c_str())

次に意味を表すメソッド名を示します。

auto handle = wil::create_new_file(path.c_str());
auto handle = wil::open_or_create_file(path.c_str());
auto handle = wil::open_or_truncate_existing_file(path.c_str());
auto handle = wil::truncate_existing_file(path.c_str());

フォルダの変更リーダー

フォルダシステムの変更監視はWin32 APIReadDirectoryChangesWが用いられます。

#include <wil/filesystem.h>

auto reader = wil::make_folder_change_reader(folder.Path().c_str(), true, wil::FolderChangeEvents::All, [](wil::FolderChangeEvent event, PCWSTR fileName)
    {
        switch (event)
        {
        case wil::FolderChangeEvent::ChangesLost:
            break;
        case wil::FolderChangeEvent::Added:
            break;
        case wil::FolderChangeEvent::Removed:
            break;
        case wil::FolderChangeEvent::Modified:
            break;
        case wil::FolderChangeEvent::RenamedOldName:
            break;
        case wil::FolderChangeEvent::RenamedNewName:
            break;
        }
    });

フォルダウォッチャ

ファイルシステムの変更監視にはWin32 APIFindFirstChangeNotificationWが用いられます。

#include <wil/filesystem.h>

auto watcher = wil::make_folder_watcher(folder.Path().c_str(), true, wil::allChangeEvents, []()
    {
        // respond
    });

ファイル情報

ファイル情報をハンドルから取得します。

auto basicInfo = wil::GetFileInfo<FileBasicInfo>(fileHandle);

ディレクトリの作成

途中の階層を含めてディレクトリを作成します。

wil::CreateDirectoryDeepNoThrow(LR"(C:\temp\folder)");

ディレクトリの削除

内容を含めてフォルダを削除します。

wil::RemoveDirectoryRecursive(LR"(c:\temp)", RemoveDirectoryOptions::RemoveReadOnly);

著作権表示

この記事は以下の著作物を使用しています。

Copyright (c) Microsoft Corporation. All rights reserved. https://github.com/microsoft/wil/blob/master/LICENSE