2017-09-30 103 views
0

如果一個文件夾包含很多文件(> 300..1000),並且磁盤驅動器速度不是很快,那麼我無法讓代碼可靠地加載完整的文件列表。首先它加載幾個文件(如10或100,取決於月亮的位置)。接下來的嘗試(runnin相同的代碼)會稍微返回更多,例如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

options.IndexerOption = IndexerOption.OnlyUseIndexer; 

如果您使用OnlyUseIndexer,它將很快查詢。但查詢結果可能不完整。原因是一些文件尚未在系統中編入索引。

options.IndexerOption = IndexerOption.DoNotUseIndexer; 

如果使用DoNotUseIndexer,它將緩慢地查詢。並且查詢結果是完整的。

此博客詳細告訴Accelerate File Operations with the Search Indexer。請參閱。

相關問題