2013-06-06 2 views
1

Windows 저장소 앱 개발을 처음 사용하고 특정 디렉터리 및 해당 하위 디렉터리의 모든 파일 크기를 가져 오는 C#으로 작성된 응용 프로그램이 있습니다. StorageFolder.GetFilesAsync() 메서드는 파일 수가 적은 디렉토리에서 제대로 작동하지만 많은 수의 파일이 포함 된 디렉토리에서는 많은 RT 태블릿과 같이 RAM이 2GB 인 장치에서만 OOM 예외가 발생합니다. 이 코드가 아래에 설명 된 것처럼 모든 파일 (매우 비효율적 인 것 같습니다)의 목록을 작성하는 대신 작은 덩어리로 파일을 처리하도록 앱을 허용하는 방법이 있습니까?Windows 저장소 앱 StorageFolder.GetFilesAsync()가 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; 
    } 
} 
+0

IMO, Windows에서 문제가 발생했습니다. 나는 왜 파일 열거가 너무 배고픈 기억이어야하는지 상상할 수 없다. 폴더에 이미지를 열거 할 때도 같은 문제가 발생했습니다. 2000 개 이미지로 RuntimeBroker는 4.5Gb의 메모리를 소비합니다! – Tristan

답변

2

과 함께 StorageFolderQueryResult.GetFoldersAsync(uint, uint)을 사용하여 청크로 폴더를 쿼리하십시오. 같은

뭔가 :

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) 
{ 
    folderList = await queryResult.GetFoldersAsync(startindIndex, 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 당신이 당신의 기억을 결합하는 방법에 따라 줄일 수 있습니다.

희망이 도움이됩니다. 해피 코딩!

+0

고맙습니다. 질문을 게시하는 사이에 실제로 알아 냈습니다.하지만 지금은 정확합니다. 여기에있는 코드와 동일한 코드를 구현했으며 문제가 해결되었습니다. 감사. – agolia

관련 문제