Windows应用商店应用StorageFolder.GetFilesAsync()导致OOM异常

时间:2013-06-06 04:49:59

标签: c# windows-8 windows-store-apps out-of-memory

我是Windows Store App开发的新手,我有一个用C#编写的应用程序,它试图获取指定目录及其子目录中所有文件的大小。 StorageFolder.GetFilesAsync()方法适用于具有少量文件的目录,但是对于包含大量文件的目录,它在仅具有2GB RAM的设备上产生OOM异常,例如许多RT平板电脑。有没有办法解决这个问题,这将允许应用程序以较小的块处理文件,而不是构建所有文件的列表(这似乎非常低效),如下面的代码所示,任何帮助将不胜感激...... < / p>

StorageFolderQueryResult queryResult = KnownFolders.RemovableDevices.CreateFolderQueryWithOptions(new QueryOptions(CommonFolderQuery.DefaultQuery));

folderList = await queryResult.GetFoldersAsync();
foreach (StorageFolder folder in folderList)
{
    IReadOnlyList<StorageFile> fileList = await folder.GetFilesAsync(CommonFileQuery.DefaultQuery);

    foreach (StorageFile file in fileList)
    {
        BasicProperties properties = await file.GetBasicPropertiesAsync();
        size += properties.Size;
    }
}

1 个答案:

答案 0 :(得分:2)

使用StorageFolderQueryResult.GetFoldersAsync(uint, uint)StorageFolderQueryResult.GetItemCountAsync一起查询文件夹中的文件夹。

类似的东西:

StorageFolderQueryResult queryResult = KnownFolders.RemovableDevices.CreateFolderQueryWithOptions(new QueryOptions(CommonFolderQuery.DefaultQuery));

uint numItems = await queryResult.GetItemCountAsync();
uint chunkSize = 50;

for(uint startingIndex = 0; startingIndex < numItems; startingIndex += chunkSize)
{
    var folderList = await queryResult.GetFoldersAsync(startingIndex, chunkSize);
    foreach (StorageFolder folder in folderList)
    {
        IReadOnlyList<StorageFile> fileList = await folder.GetFilesAsync(CommonFileQuery.DefaultQuery);

        foreach (StorageFile file in fileList)
        {
            BasicProperties properties = await file.GetBasicPropertiesAsync();
            size += properties.Size;
        }
    }
}   

您可以根据想要约束记忆的方式增加或减少chunkSize

希望这会有所帮助。快乐的编码!