1

私は Windows ストア アプリの開発に不慣れで、指定されたディレクトリとそのサブディレクトリ内のすべてのファイルのサイズを取得しようとする C# で記述されたアプリを持っています。StorageFolder.GetFilesAsync() メソッドは、少数のファイルを含むディレクトリでは正常に機能しますが、多数のファイルを含むディレクトリでは、多くの RT タブレットなど、RAM が 2GB しかないデバイスで OOM 例外が発生します。以下のコードが示すように、すべてのファイルのリストを作成するのではなく (非常に非効率的なようです)、アプリがファイルを小さなチャンクで処理できるようにする方法はありますか?

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;
    }
}
4

1 に答える 1

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メモリをバインドする方法に基づいて、を増減できます。

お役に立てれば。ハッピーコーディング!

于 2013-06-06T19:56:46.663 に答える