使用Windows应用商店应用程序进行最快的硬盘扫描

本文关键字:硬盘 扫描 应用 Windows 应用程序 使用 | 更新日期: 2023-09-27 18:00:18

我正在尝试让我的Windows应用商店应用程序扫描我的用户的硬盘,寻找具有特定扩展名的文件,以便我的应用程序能够在内部菜单中显示它们。显然,由于需要权限,用户最初必须使用FolderPicker来指示他想要扫描的驱动器的根目录。

遗憾的是,我在MSDN上找到的所有方法都导致了非常糟糕的性能。页面https://msdn.microsoft.com/en-us/library/windows/apps/hh994634.aspx具有以下示例,作为简单文件夹枚举任务的性能更好的替代方案。通过使用FolderDepth属性设置为FolderDepth.DeepQueryOptions对象,然后让用户指向根文件夹,您可以很容易地将其调整为处理扫描整个驱动器。

// 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应用商店应用程序进行最快的硬盘扫描

Windows Search具有文件夹和文件(此服务监视的)的预构建索引。要达到这种性能,您应该建立自己的索引,并在以后使用它。没有办法加速线性扫描,在GetFilesAsync中等待是应用程序性能最高的标志。