使用Windows应用商店应用程序进行最快的硬盘扫描
本文关键字:硬盘 扫描 应用 Windows 应用程序 使用 | 更新日期: 2023-09-27 18:00:18
我正在尝试让我的Windows应用商店应用程序扫描我的用户的硬盘,寻找具有特定扩展名的文件,以便我的应用程序能够在内部菜单中显示它们。显然,由于需要权限,用户最初必须使用FolderPicker来指示他想要扫描的驱动器的根目录。
遗憾的是,我在MSDN上找到的所有方法都导致了非常糟糕的性能。页面https://msdn.microsoft.com/en-us/library/windows/apps/hh994634.aspx具有以下示例,作为简单文件夹枚举任务的性能更好的替代方案。通过使用FolderDepth
属性设置为FolderDepth.Deep
的QueryOptions
对象,然后让用户指向根文件夹,您可以很容易地将其调整为处理扫描整个驱动器。
// Set QueryOptions to prefetch our specific properties
var queryOptions = new Windows.Storage.Search.QueryOptions(CommonFileQuery.OrderByDate, null);
queryOptions.SetThumbnailPrefetch(ThumbnailMode.PicturesView, 100,
ThumbnailOptions.ReturnOnlyIfCached);
queryOptions.SetPropertyPrefetch(PropertyPrefetchOptions.ImageProperties,
new string[] {"System.Size"});
StorageFileQueryResult queryResults = KnownFolders.PicturesLibrary.CreateFileQueryWithOptions(queryOptions);
IReadOnlyList<StorageFile> files = await queryResults.GetFilesAsync();
foreach (var file in files)
{
ImageProperties imageProperties = await file.Properties.GetImagePropertiesAsync();
// Do something with the date the image was taken.
DateTimeOffset dateTaken = imageProperties.DateTaken;
// Performance gains increase with the number of properties that are accessed.
IDictionary<String, object> propertyResults =
await file.Properties.RetrievePropertiesAsync(
new string[] {"System.Size" });
// Get/Set extra properties here
var systemSize = propertyResults["System.Size"];
}
对于一个大约有50GB数据的普通硬盘,这种方法可能需要5~10分钟,这真的是不可接受的。然而,奇怪的是,对该文件类型执行windows搜索会在不到30秒内返回查询,这意味着在某个地方还有提高性能的空间。
有人知道能更快地完成这项任务的方法吗?
Windows Search具有文件夹和文件(此服务监视的)的预构建索引。要达到这种性能,您应该建立自己的索引,并在以后使用它。没有办法加速线性扫描,在GetFilesAsync
中等待是应用程序性能最高的标志。