2017-09-30 2 views
0

폴더에 여러 파일 (> 300..1000)이 포함되어 있고 디스크 드라이브가 매우 빠르지 않은 경우 전체 파일 목록을 안정적으로로드하는 코드를 가져올 수 없습니다. 먼저 Moon 위치에 따라 10 또는 100과 같은 몇 개의 파일을로드합니다. 다음 시도 (동일한 코드를 실행)는 예를 들어 200과 같이 약간 더 반환되지만이 수가 증가 할 것이라는 보장은 없습니다. 포함UWP - 안정적으로 파일을 폴더에서 가져 오는 방법은 무엇입니까?

내가 노력 많은 변종 :

res = new List<StorageFile>(await query.GetFilesAsync()); 

과 :

public async static Task<List<StorageFile>> GetFilesInChunks(
    this StorageFileQueryResult query) 
{ 
     List<StorageFile> res = new List<StorageFile>(); 
     List<StorageFile> chunk = null; 
     uint chunkSize = 200; 
     bool isLastChance = false; 

     try 
     { 
      for (uint startIndex = 0; startIndex < 1000000;) 
      { 
       var files = await query.GetFilesAsync(startIndex, chunkSize); 
       chunk = new List<StorageFile>(files); 

       res.AddRange(chunk); 

       if (chunk.Count == 0) 
       { 
        if (isLastChance) 
         break; 
        else 
        { 
         /// pretty awkward attempt to rebuild the query, but this doesn't help too much :)       
         await query.GetFilesAsync(0, 1); 

         isLastChance = true; 
        } 
       } 
       else 
        isLastChance = false; 

       startIndex += (uint)chunk.Count; 
      } 
     } 
     catch 
     { 
     } 

     return res; 
    } 

이 코드는 비트 복잡한 보이는,하지만 난 이미 단순한 변종을 :(시도했다

겠습니까 이걸 도와 줘서 기뻐.

답변

0

안정적으로 폴더에서 파일을 가져 오는 방법은 무엇입니까?

많은 수의 파일을 열거하는 데 권장되는 방법은 GetFilesAsync의 일괄 처리 기능을 사용하여 필요에 따라 파일 그룹을 페이지하는 것입니다. 이렇게하면 다음 세트가 생성되기를 기다리는 동안 앱에서 파일에 대한 백그라운드 처리를 수행 할 수 있습니다.

예는

uint index = 0, stepSize = 10; 
IReadOnlyList<StorageFile> files = await queryResult.GetFilesAsync(index, stepSize); 
index += 10; 
while (files.Count != 0) 
{ 
    var fileTask = queryResult.GetFilesAsync(index, stepSize).AsTask(); 
    foreach (StorageFile file in files) 
    { 
    // Do the background processing here 
    } 
    files = await fileTask; 
    index += 10; 
} 

당신이 만든 StorageFileQueryResult의 확장 방법은 위의 유사합니다.

그러나 파일을 얻는 것이 위와 관련이 없으므로 QueryOptions에 의존합니다. 당신이 OnlyUseIndexer를 사용하는 경우

options.IndexerOption = IndexerOption.OnlyUseIndexer; 

, 그것은 매우 빠르게 쿼리합니다. 그러나 쿼리 결과가 완전하지 않을 수 있습니다. 그 이유는 일부 파일이 아직 시스템에서 인덱싱되지 않았기 때문입니다.

options.IndexerOption = IndexerOption.DoNotUseIndexer; 

DoNotUseIndexer을 사용하면 천천히 쿼리합니다. 그리고 쿼리 결과가 완료됩니다.

이 블로그는 Accelerate File Operations with the Search Indexer에 대해 자세히 알려줍니다. 참조하십시오.

관련 문제