UWP - Как надежно получить файлы из папки?

Если папка содержит много файлов (>300..1000), а дисковод работает не очень быстро, то я не могу получить код для надежной загрузки полного списка файлов. Сначала он загружает несколько файлов (например, 10 или 100, в зависимости от положения Луны). Следующие попытки (запуска того же кода) вернут немного больше, например 200, но нет гарантии, что это число будет расти.

Я пробовал много вариантов, в том числе:

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

Этот код выглядит немного сложным, но я уже пробовал его более простые варианты :(

Буду рад вашей помощи в этом..


person Sergey Lyutko    schedule 30.09.2017    source источник


Ответы (1)


Как надежно получить файлы из папки?

Рекомендуемый способ перечисления большого количества файлов — использовать функцию пакетной обработки в 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, он будет запрашивать медленно. И результат запроса завершен.

В этом блоге рассказывается об Ускорение операций с файлами с помощью индексатора поиска подробно. Пожалуйста, обратитесь к.

person Nico Zhu - MSFT    schedule 03.10.2017