如何跟踪最近使用的文件和文件夹 (HTML)
[ 本文适用于编写 Windows 运行时应用的 Windows 8.x 和 Windows Phone 8.x 开发人员。如果你要针对 Windows 10 进行开发,请参阅 最新文档 ]
通过将用户经常访问的文件添加到你的应用的最近所用列表中来跟踪这些文件。该平台会为你管理 mostRecentlyUsedList,它会根据各个项的上次访问时间对它们进行排序,并在列表中的项超过 25 个的限制时删除最旧的项。所有应用都有其各自的 mostRecentlyUsedList。
通常,你的应用的最近所用列表 (MRU) 最适合用于跟踪用户最近使用的文件,但 MRU 也可用于跟踪文件夹。在你的应用的最近所用列表 (MRU) 列表中既可以存储文件也可以存储文件夹。项被存储为 IStorageItem 对象,这意味着 storageFile 对象(代表文件)和 storageFolder 对象(代表文件夹)都可以添加到 MRU 中。
先决条件
介绍默认情况下,你的应用具有对哪些文件和位置的访问权限,以及可以通过哪些方法获取对其他文件和位置的访问权限。
介绍如何让用户选取要通过你的应用操作的文件。选取的文件通常是用户再三返回查看的文件。
相关示例
向 MRU 中添加选取的文件
用户选取的文件通常是他/她再三返回查看的文件。因此,如果用户选取某个文件,则最好考虑将该文件添加到你的应用的最近所用列表 (MRU) 中。按照以下步骤,你可以轻松而即时地将选取的文件添加到 MRU 中。
在应用中找到让用户选取文件和/或文件夹的代码。
如果你不确定该代码位于何处,或如果你不知道如何使用文件选取器访问文件,请先参阅快速入门:使用文件选取器访问文件,然后再继续。
例如,如果你让用户选取某个文件,则代码应类似如下:
var openPicker = new Windows.Storage.Pickers.FileOpenPicker(); openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail; openPicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.picturesLibrary; openPicker.fileTypeFilter.replaceAll([".png", ".jpg", ".jpeg"]); // Open the picker for the user to pick a file openPicker.pickSingleFileAsync().done(function (pickedFile) { if (pickedFile) { // Process picked file } else { // Canceled; no file was picked } });
当异步调用返回 pickSingleFileAsync(此示例中)时,用户选取的文件会作为 storageFile 返回。我们使用 done 将选取的文件(示例中的
pickedFile
)传递到处理函数(在此示例中为匿名函数),该函数会将文件添加到 mostRecentlyUsedList。如果要让用户选取文件夹而非文件,则代码需使用 pickSingleFolderAsync,且选取的文件夹作为 storageFolder 返回。
在处理函数中添加如下一行代码,将选取的文件添加到最近所用列表 (MRU) 中:
var mruToken = Windows.Storage.AccessCache.StorageApplicationPermissions.mostRecentlyUsedList.add(pickedFile, pickedFile.name);
mostRecentlyUsedList.add 被重载。此示例中使用了 add(fileOrFolder, metadata),这样便可将元数据与文件关联。设置元数据可以收集其他信息(如各项的用途)。此示例通过将元数据设置为"用户头像"来收集文件的用途。 你还可以通过调用 add(fileOrFolder) 将文件添加到不包含元数据的 MRU 中。
无论何时向 MRU 中 add 项时,该方法都会返回一个唯一标识的字符串(称为令牌),用于检索该项。此示例在
mruToken
本地变量中捕获此令牌,但不对此令牌作其他任何操作。提示 由于你需要使用令牌检索 MRU 中的项,因此,你应该考虑将令牌保存到应用数据以备后用。例如,如果你的应用将用户头像添加到 MRU 中(如示例所展示),则你需要将令牌保存到应用数据中用于跟踪用户头像的列表中。有关应用数据的详细信息,请参阅管理应用程序数据。
现在,你的处理函数应类似如下:
openPicker.pickSingleFileAsync().done(function (pickedFile) { if (pickedFile) { // Add picked file to MRU var mruToken = Windows.Storage.AccessCache.StorageApplicationPermissions.mostRecentlyUsedList.add(pickedFile, pickedFile.name); // Continue processing picked file } else { // Canceled; no file was picked } });
使用令牌检索 MRU 中的项
要检索 mostRecentlyUsedList 中的项,你需要该项的令牌。你应该使用最适用于要检索的项的检索方法:
- 使用 getFileAsync 检索作为 storageFile 的文件。
- 使用 getFolderAsync 检索作为 storageFolder 的文件夹。
- 使用 getItemAsync 检索既可代表文件也可代表文件夹的通用 IStorageItem。
例如,我们可以使用以下代码获取 MRU 中第一项(文件)的令牌,然后使用该令牌检索代表该文件的 storageFile:
var mruFirstToken = Windows.Storage.AccessCache.StorageApplicationPermissions.mostRecentlyUsedList.entries.first.token;
Windows.Storage.AccessCache.StorageApplicationPermissions.mostRecentlyUsedList.getFileAsync(mruFirstToken).done(
function (retrievedFile) {
// Process retrieved file
},
function (error) {
// Handle errors
}
);
在此示例中,我们知道第一项是一个文件,因为我们向 mostRecentlyUsedList 中仅添加了一个文件。
检索 MRU 中所有项的令牌
你可以通过迭代如下条目来检索列表中每个项的令牌:
var mruEntries = Windows.Storage.AccessCache.StorageApplicationPermissions.mostRecentlyUsedList.entries;
if (mruEntries.size > 0) {
mruEntries.forEach(function (entry) {
var mruToken = entry.token;
// Continue processing the MRU entry
});
} else {
// Handle empty MRU
}
这些条目是包含项的令牌和元数据的 accessListEntry 结构。条目中不包含项本身,因而无法用于直接检索关联的项。
你可以改用 accessListEntry 来检索某个关联项的令牌,然后使用前一部分使用令牌检索 MRU 中的项所列方法之一检索项。此示例在 mruToken
本地变量中捕获各条目的令牌,但不对令牌作其他任何操作。
存储在 accessListEntry 中的元数据是一个包含项的其他信息的字符串。 你可以在将项添加到 mostRecentlyUsedList 时指定该信息。
备注
当达到 25 项的限制时从 MRU 中删除项
当达到 MRU 的 25 项这一限制并尝试添加新项目时,Windows 会自动删除最旧的项(上次访问时间最早的项)。因此,即使 MRU 中包含的项已达到最大个数 (25),你也无需在添加新项之前删除某个项。
保留对 25 项限制以外文件和文件夹的访问权限
除了最近所用列表之外,你的应用还具有一个未来访问列表 (futureAccessList),你可以使用该列表来维护应用对可能无法通过其他方法访问的文件和文件夹的访问权限。
当用户选取某个文件或文件夹时,你应该考虑将该项同时添加到你的应用的 mostRecentlyUsedList 和 futureAccessList 中。将文件或文件夹添加到 futureAccessList 有助于确保即使用户不经常返回查看该项,你的应用也可以保持对该项的访问权限。
futureAccessList 的使用方法与 MRU 的使用方法在以下几个方面有所不同:
- futureAccessList 最多可包含 1000 项。
- 与 MRU 不同,该平台不会为你管理 futureAccessList。当你达到 1000 项的上限时,必须从列表中删除一项才能添加新项。你可以通过使用 remove 方法执行此操作。
默认情况下,所有应用都有其各自的 mostRecentlyUsedList 和 futureAccessList。