MRが楽しい

MRやVRについて学習したことを書き残す

HoloLensでファイル変更イベントを検出する その2(UWPでのコード)

本日は Unity と HoloLens の技術調査枠です。
UWPアプリでファイル変更イベントを検出する方法をまとめます。

前回記事の続きです。
bluebirdofoz.hatenablog.com

UWPにおけるファイル変更イベント

前回記事で説明した通り、UWPアプリでファイル変更イベントを取得する場合、StorageFileQueryResult
を利用します。
docs.microsoft.com

StorageFileQueryResultを用いたサンプルコード

以下の処理を行うサンプルコードを作成しました。
1.アプリケーションフォルダの LocalState フォルダに TXT ファイルが作成/削除/変更されたイベントを検出します。
2.イベントを検出すると、UnityEvent で指定された関数を実行します。
f:id:bluebirdofoz:20190306092314j:plain

/// <summary>
/// ファイル監視初期化
/// </summary>
void QueryResult_Init()
{
     // 監視を行うファイルの拡張子をリストに追加する
     // 全てのファイルを監視する場合はQueryOptionsで以下のList<string>を指定する
     // ・"*"の単一のエントリを含む配列
     // ・空の配列
     // ・null
     // 複数の拡張子を監視する場合は.Addで監視対象の拡張子をリストに追加する
     List<string> fileTypeFilter = new List<string>();
     fileTypeFilter.Add(".txt");
     // ファイルリストのソート順とフィルターを指定する
     // OrderByNameではファイルは名前順にソートされる
     Windows.Storage.Search.QueryOptions queryOptions =
         new Windows.Storage.Search.QueryOptions
             (Windows.Storage.Search.CommonFileQuery.OrderByName, fileTypeFilter);

     // 監視を行うディレクトリに作成した QueryOptions を設定する(本例はLocalStateフォルダ)
     // 戻り値として StorageFileQueryResult のインスタンスが取得できる
     Windows.Storage.Search.StorageFileQueryResult queryResult =
         Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileQueryWithOptions(queryOptions);

     // イベントを登録
     queryResult.ContentsChanged += QueryResult_Changed;

     // 監視を開始する
     IReadOnlyList<StorageFile> fileList = await queryResult.GetFilesAsync();
}

/// <summary>
/// ファイル変更イベントコールバック
/// </summary>
void QueryResult_Changed(Windows.Storage.Search.IStorageQueryResultBase sender, object args)
{
     // ファイル変更イベント発生時の処理
}

サブフォルダのイベントについて

前述のコード例では指定ディレクトリの直下にあるファイルのみが監視対象となります。
サブフォルダを含めたディレクトリ配下全てのフォルダ・ファイルを監視する場合は以下のように指定します。

    // QueryOptions()で初期化し、FolderDepth に Deep を指定するとサブフォルダも対象となる
    Windows.Storage.Search.QueryOptions queryOptions =
        new Windows.Storage.Search.QueryOptions
            {
                FileTypeFilter = { "*" } ,
                FolderDepth = Windows.Storage.Search.FolderDepth.Deep
            };

    // 監視を行うディレクトリに作成した QueryOptions を設定する
    Windows.Storage.Search.StorageFileQueryResult queryResult =
        Windows.Storage.ApplicationData.Current.LocalFolder.CreateFileQueryWithOptions(queryOptions);
    queryResult.ContentsChanged += QueryContentsChanged;

イベントのトリガーについて

どのファイルが追加、削除、変更されたか(イベントのトリガーとなったか)の情報は取得できないとの事です。
stackoverflow.com
lunarfrog.com

ファイルのPropertiesを確認し、最も新しい更新ファイルを検索する必要があります。
削除のイベントも考慮すると、前回のファイルリストとの比較も必要になります。

後は前回の UnityEditor 向けコードと組み合わせます。
記事が長くなったので分けます。