2015-09-19 3 views
7

StorageFolder.GetFilesAsync невероятно медленно:Более быстрый способ получить файлы из папки, чем StorageFolder.GetFilesAsync()?

  • ~ 7 секунд для папки с ~ 3500 файлов

Назад в Windows Phone 8.0 Silverlight, я был в состоянии получить содержание CameraRoll гораздо быстрее (через MediaLibrary):

  • < 1 второе для того же количества файлов

Есть ли возможности для ускорения GetFilesAsync, или есть ли альтернатива для получения файлов в папке?

мне нужны файлы фотографий, чтобы немедленно извлечь информацию, такую ​​как Geotag или DateTaken. Вы можете видеть, как быстро они загружаются с помощью Silverlight в моем приложении GeoPhoto, который я сейчас пытаюсь выполнить для подключения к UWP. Я уже реализовал кеширование (отображение геотаг и DateTaken с помощью пути к картинке), поэтому мне понадобится только путь для последующего запуска приложений. Фотографии, еще не сохраненные в кэше, могут отображаться позже (после длинного GetFilesAsync -call), но важно предоставить пользователю то, с чем он может взаимодействовать, сразу после запуска приложения.

+1

Вы пробовали пространство имен 'Windows.Storage.BulkAccess'? 'FileInformationFactory.GetFilesAsync' и' FileInformationFactory.GetVirtualizedFilesVector' могут быть быстрее. –

+0

@RaymondChen - я просто попробовал метод FileInformationFactory.GetFilesAsync, чтобы узнать, было ли это быстрее, поскольку я никогда не использовал его раньше ... в хромом примере я испек с 10500 файлами, это 45-60 секунд, чтобы вернуться, похожее на 'StorageFolder.GetFilesAsync' раз. – WiredPrairie

+0

Является ли ваша папка в индексированном месте (например, в библиотеке)? Если нет, тогда нет выбора, кроме как попасть на диск. Кроме того, вы попробовали «GetVirtualizedFilesVector»? Я предполагаю, что у виртуализованного вектора меньше работы, потому что он может создать контент лениво. –

ответ

0

Интересно, если вы читали это: https://www.suchan.cz/2014/07/file-io-best-practices-in-windows-and-phone-apps-part-1-available-apis-and-file-exists-checking/

Окна 8.1 - наконец, на Windows, 8.1 самый быстрый способ это новый метод StorageFolder.TryGetItemAsync, но только с небольшим перевесом, когда по сравнению с другие методы. Основным преимуществом здесь является, безусловно, простой код, не требующий исключения, если файл не существует. Результаты для методов синхронизации аналогичны платформе Windows 8 , если исходный контекст синхронизации не требуется, методы синхронизации являются лучшим выбором.

Короче говоря, для проверки наличия целевого файла на WP8 и WP8.1 Silverlight самым быстрым методом является File.Exists, в Windows 8 и WP8.1 XAML вы должны использовать StorageFolder.GetFileAsync и в Windows 8.1 использовать новый метод StorageFolder.TryGetItemAsync. НЕ используйте итерацию из StorageFiles, возвращенную из StorageFolder.GetFilesAsync на любой платформе , она очень медленная. Также, если вам не нужно co continue на в исходной теме, вы можете использовать синхронные альтернативы на WP8.1 платформах XAML, Windows 8 и Windows 8.1.

или что-то в этом роде?

StorageFolder.GetItemsAsync(UInt32, UInt32) 

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

https://msdn.microsoft.com/en-us/library/windows/apps/br227287.aspx

0

EDIT: Поскольку мой первоначальный ответ, казалось, не быть полезным, я надеюсь, что это один будет соответствие вашей проблемы.

Я создал папку с ~ 4000 файлами, просто для тестирования и использовал секундомер для временного хранения.
Просто читать каждый элемент в папке взяли:

System.IO.Directory.GetFiles(): 0,2 сек

Windows.Storage.StorageFolder.GetFilesAsync~ 5.5 СЕК

Выполнение как Mulitple раз и в другом порядке

Я понимаю и что это просто дает вам имена файлов в виде строки, но в зависимости от библиотеки, которую вы используете для чтения изображений, это все равно может помочь вам.

Оригинал Ответ:
Когда вы получили путь в виде строки (например из ApplicationData.Current.LocalFolder.Path), вы можете использовать System.IO.Directory.GetFiles(string path). Он не возвращает определенные объекты, а путь как строку. Вы можете использовать их со статическим классом System.IO.File.

Он также позволяет вам пройти поискPattern, который позволяет использовать заполнители, такие как * и ?, и он работает синхронно, но извлечение файлов с помощью этого метода работает очень быстро.

+0

Вопрос не только старый, но и достаточно понятный из-за недостатка скорости. Как ваш ответ называется? –

Смежные вопросы