torazaemon2016’s blog

手書き文字認識メモ開発

ChatGPTに聞いてみた (UWPでMRUを扱うとき)

UWPでのプログラミングで、バグにあたって悩んだので、はやりのChatGPTに聞いてみた。

質問.

UWPでStorageApplicationPermissions.MostRecentlyUsedList.Add したとき、25番目はどこに入るのか。一番古いものが消えるのではないのか?最新のものと入れ替わるのはなぜ?

に対して、回答のなかに

UWPアプリケーションで StorageApplicationPermissions.MostRecentlyUsedList.Add メソッドを使用して、アプリケーションで最近使用したファイルのリストを管理できます。このメソッドを使用すると、指定したファイルがリストの先頭に追加され、古いエントリはリストの末尾から自動的に削除されます。

最近使用したファイルのリストは、Windowsによって管理され、既定では25個のエントリを保持します。したがって、25番目のエントリが追加された場合、古いエントリは自動的に削除されます。一番古いエントリが消えるわけではなく、末尾のエントリが削除されます。

以下省略

って日本語で回答してくれ、『一番古いエントリが消えるわけではなく』という大きなヒントと、「末尾のエントリが削除されます」で、原因がわかりました。

 

プログラムで、

MRUの全リストの存在チェックのあとに、逆順(古いものが新しいほうになる)になるバグというのもので

AccessListEntryView mruEnt = StorageApplicationPermissions.MostRecentlyUsedList.Entries;
var list = mruEnt.Select(entry => new { FileName = entry.Metadata, Token = entry.Token });

// List checkして、ないものはMRUから消す、また名前が変わっていないか?
foreach (var l in list)
{
       Debug.WriteLine("list  " + l.FileName + " / " + l.Token);

       Windows.Storage.StorageFolder folder = null;
       try
       {
             folder = await StorageApplicationPermissions.MostRecentlyUsedList.GetFolderAsync(l.Token);

             if (folder.DisplayName != l.FileName)
             {
                 Debug.WriteLine("Folder renamed?." + folder.Path + " / " + folder.DisplayName + " / " + l.FileName + " / " + l.Token);
                 mru.Remove(l.Token);
            }
      }
      catch (Exception ex)
      {
                    Debug.WriteLine("Folder not Found. Delete from List." + l.FileName + " / " + l.Token);
                    mru.Remove(l.Token);
       }
}

のあと、MRUが全部逆順(最新が一番末尾のリスト)になるので、このあと「25番目の追加」が入ると、結果「最新のものが飛び出してしまう」ことになっていました。

考えれば、リストの頭(最新のもの)から順にチェックするので、結果、最も古いものが最後にチェックされ、最新になってしまうというだけのこと。

(Debug()を入れてみればわかる話でしたが・・・)

foreach (var l in list.reverse())

とリストの逆順(古いほう)からで解決です。

 

ChatGPTからのヒントで気が付くことができたこと、面白い体験でした。

HAL9000やゾラック、ジャビーがもうすぐなのかもしれません。