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やゾラック、ジャビーがもうすぐなのかもしれません。