StorageFileQueryResult.GetFilesAsync() 在 UWP 中正确使用 IndexerOption
StorageFileQueryResult.GetFilesAsync() proper usage with IndexerOption in UWP
我想知道以下是错误还是至多是 Windows 搜索 API 的 StorageFolder
.
的文档不准确
这是一个简单的 UWP 应用程序,允许用户选择一个文件夹并深入扫描该文件夹以简单地计算文件数量。
returned 计数与 Windows10 的文件资源管理器一致,如果文件夹在这里放置了一段时间,但如果文件夹刚刚从另一个分区复制到 C 驱动器,则不一致在我的笔记本电脑上。为了弄清楚这个问题,我复制了一个包含 1768 视频和图像文件的文件夹到桌面和 运行 当场的应用程序,这样 Windows 10 没有索引内容的时间。
C#代码(XAML很简单,从C#代码就能猜出来)
private async void AppBarButton_Click(object sender, RoutedEventArgs e)
{
var folderPicker = new FolderPicker
{
SuggestedStartLocation = PickerLocationId.Desktop,
ViewMode = PickerViewMode.Thumbnail
};
folderPicker.FileTypeFilter.Add("*");
_folder = await folderPicker.PickSingleFolderAsync();
if (_folder != null)
{
resultStackPanel.Children.Clear();
var indexState = await _folder.GetIndexedStateAsync();
bottomInfoTextBlock.Text = indexState.ToString();
var queryOptions = new QueryOptions { FolderDepth = FolderDepth.Deep };
foreach (IndexerOption indexerOption in Enum.GetValues(typeof(IndexerOption)))
{
queryOptions.IndexerOption = indexerOption;
await CountFilesAsync(queryOptions);
}
}
}
private async Task CountFilesAsync(QueryOptions queryOptions)
{
var textBlock = new TextBlock();
resultStackPanel.Children.Add(textBlock);
if (!_folder.AreQueryOptionsSupported(queryOptions))
{
textBlock.Text = $"Query unsupported for {queryOptions.IndexerOption}";
return;
}
var query = _folder.CreateFileQueryWithOptions(queryOptions);
textBlock.Text = $"{queryOptions.IndexerOption}: Wait, getting files count ...";
var numOfFiles = (await query.GetFilesAsync()).Count;
textBlock.Text = $"{queryOptions.IndexerOption} {numOfFiles}";
}
}
当我遍历 IndexerOption
Enum
时,我得到了以下结果
我期望的是 IndexerOption.UseIndexerWhenAvailable
会 return 1768
的确切计数,因为它被记录为
Use the system index for content that has been indexed and use the file system directly for content that has not been indexed.
我担心的是,由于性能原因,我想避免使用 DoNotUseIndexer
Enum
值,因为我计划从每个存储文件中检索缩略图和额外属性,但此选项是唯一给出正确计数的。
我发现 Microsoft 的照片应用程序只加载了一部分内容,即好像它使用 UseIndexerWhenAvailable
,但它有能力在我等待 1-2 分钟时自行更新。
因此我想知道是否:
1) 我为用户提供准确结果的唯一解决方案是使用 DoNotUseIndexer
Enum
或者是否可以 UseIndexerWhenAvailable
或理想情况下 OnlyUseIndexerAndOptimizeForIndexedProperties
但是通过一些事件跟踪
当 Windows 10 最终索引所有文件以通知我的应用程序时?
2) UseIndexerWhenAvailable
实际上在做什么?好像和描述不符
谢谢
以下允许在文件系统更改时通知应用程序。在调用方法中触发事件
query.ContentsChanged += Query_ContentsChanged;
和
private async void Query_ContentsChanged(IStorageQueryResultBase sender, object args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
var count = await sender.GetItemCountAsync();
var textBlock = new TextBlock();
resultStackPanel.Children.Add(textBlock);
textBlock.Text = $"Changed {count} {sender.Folder.Name}";
});
}
局部变量count
可以在页面中设置为属性,例如OneWay
绑定到 XAML TextBlock.Text
和 INotifyPropertyChanged
。通过这种方式,值将更新为 Windows 为所有文件编制索引,大约一分钟后计数达到最终值 1768。此外,删除或添加文件夹中的文件将更新 UI 计数。唯一要注意的是,如果您在某个时候重命名该文件夹。在这种情况下,应用程序将开始计算默认值 SuggestedStartLocation
,在我的例子中是桌面。因此,根据选择的 _folder
检查 sender.Folder.Name
的效用(代码未显示)。
我想知道以下是错误还是至多是 Windows 搜索 API 的 StorageFolder
.
这是一个简单的 UWP 应用程序,允许用户选择一个文件夹并深入扫描该文件夹以简单地计算文件数量。
returned 计数与 Windows10 的文件资源管理器一致,如果文件夹在这里放置了一段时间,但如果文件夹刚刚从另一个分区复制到 C 驱动器,则不一致在我的笔记本电脑上。为了弄清楚这个问题,我复制了一个包含 1768 视频和图像文件的文件夹到桌面和 运行 当场的应用程序,这样 Windows 10 没有索引内容的时间。
C#代码(XAML很简单,从C#代码就能猜出来)
private async void AppBarButton_Click(object sender, RoutedEventArgs e)
{
var folderPicker = new FolderPicker
{
SuggestedStartLocation = PickerLocationId.Desktop,
ViewMode = PickerViewMode.Thumbnail
};
folderPicker.FileTypeFilter.Add("*");
_folder = await folderPicker.PickSingleFolderAsync();
if (_folder != null)
{
resultStackPanel.Children.Clear();
var indexState = await _folder.GetIndexedStateAsync();
bottomInfoTextBlock.Text = indexState.ToString();
var queryOptions = new QueryOptions { FolderDepth = FolderDepth.Deep };
foreach (IndexerOption indexerOption in Enum.GetValues(typeof(IndexerOption)))
{
queryOptions.IndexerOption = indexerOption;
await CountFilesAsync(queryOptions);
}
}
}
private async Task CountFilesAsync(QueryOptions queryOptions)
{
var textBlock = new TextBlock();
resultStackPanel.Children.Add(textBlock);
if (!_folder.AreQueryOptionsSupported(queryOptions))
{
textBlock.Text = $"Query unsupported for {queryOptions.IndexerOption}";
return;
}
var query = _folder.CreateFileQueryWithOptions(queryOptions);
textBlock.Text = $"{queryOptions.IndexerOption}: Wait, getting files count ...";
var numOfFiles = (await query.GetFilesAsync()).Count;
textBlock.Text = $"{queryOptions.IndexerOption} {numOfFiles}";
}
}
当我遍历 IndexerOption
Enum
我期望的是 IndexerOption.UseIndexerWhenAvailable
会 return 1768
的确切计数,因为它被记录为
Use the system index for content that has been indexed and use the file system directly for content that has not been indexed.
我担心的是,由于性能原因,我想避免使用 DoNotUseIndexer
Enum
值,因为我计划从每个存储文件中检索缩略图和额外属性,但此选项是唯一给出正确计数的。
我发现 Microsoft 的照片应用程序只加载了一部分内容,即好像它使用 UseIndexerWhenAvailable
,但它有能力在我等待 1-2 分钟时自行更新。
因此我想知道是否:
1) 我为用户提供准确结果的唯一解决方案是使用 DoNotUseIndexer
Enum
或者是否可以 UseIndexerWhenAvailable
或理想情况下 OnlyUseIndexerAndOptimizeForIndexedProperties
但是通过一些事件跟踪
当 Windows 10 最终索引所有文件以通知我的应用程序时?
2) UseIndexerWhenAvailable
实际上在做什么?好像和描述不符
谢谢
以下允许在文件系统更改时通知应用程序。在调用方法中触发事件
query.ContentsChanged += Query_ContentsChanged;
和
private async void Query_ContentsChanged(IStorageQueryResultBase sender, object args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
var count = await sender.GetItemCountAsync();
var textBlock = new TextBlock();
resultStackPanel.Children.Add(textBlock);
textBlock.Text = $"Changed {count} {sender.Folder.Name}";
});
}
局部变量count
可以在页面中设置为属性,例如OneWay
绑定到 XAML TextBlock.Text
和 INotifyPropertyChanged
。通过这种方式,值将更新为 Windows 为所有文件编制索引,大约一分钟后计数达到最终值 1768。此外,删除或添加文件夹中的文件将更新 UI 计数。唯一要注意的是,如果您在某个时候重命名该文件夹。在这种情况下,应用程序将开始计算默认值 SuggestedStartLocation
,在我的例子中是桌面。因此,根据选择的 _folder
检查 sender.Folder.Name
的效用(代码未显示)。