Intereting Posts
Ошибка прокрутки в виртуализованном Treeview WPF Как использовать службы WCF RIA с приложением WPF? Сопоставление столбцов в корневом коде Entity First Что такое безопасный способ остановить stream? Насколько надежным является протокол .NET TCP? Обозначение запроса для поля «источник» sitecore в построителе шаблонов «В наборе изменений был обнаружен цикл» При попытке добавить циклически связанный список в базу данных Маскирование текстового поля для принятия только десятичных знаков Как вызвать веб-API REST для токена доступа с этими командами cURL – в C # Почему этот код вызывает System.ExecutionEngineException Если вы создаете DomainService, выставляя объект, можете ли вы получить доступ к агрегатным объектам? MVC, как вернуть представление с параметром Случай переключения в C # – ожидается постоянное значение Создайте .txt-файл, если он не существует, и если он добавляет новую строку Разница между CancellationTokenSource и флагом выхода для выхода цикла Task

Получение количества файлов в StorageFolder

Я работал с приложением Windows Phone 8.1 (RT), я хотел знать, как получить количество файлов внутри StorageFolder .

Я знаю, что мы можем использовать StorageFolder.GetFilesAsync() а затем проверить количество возвращаемого списка. Но так как этот метод занимает слишком много времени и возвращает все элементы, существует ли более эффективный способ сделать это?

Вы можете получить на 3 порядка более высокую производительность, если вы используете Win32 API для получения количества файлов, но он работает только для вашего локального каталога хранилища (он не будет работать для брокерских мест, таких как Pictures или Music). Например, учитывая следующий компонент C ++ / CX:

заголовок

 public ref struct FilePerfTest sealed { Windows::Foundation::IAsyncOperation^ GetFileCountWin32Async(); uint32 GetFileCountWin32(); }; 

Реализация

 uint32 FilePerfTest::GetFileCountWin32() { std::wstring localFolderPath(ApplicationData::Current->LocalFolder->Path->Data()); localFolderPath += L"\\Test\\*"; uint32 found = 0; WIN32_FIND_DATA findData{0}; HANDLE hFile = FindFirstFileEx(localFolderPath.c_str(), FindExInfoBasic, &findData, FindExSearchNameMatch, nullptr, FIND_FIRST_EX_LARGE_FETCH); if (hFile == INVALID_HANDLE_VALUE) throw ref new Platform::Exception(GetLastError(), L"Can't FindFirstFile"); do { if ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) ++found; } while (FindNextFile(hFile, &findData) != 0); auto hr = GetLastError(); FindClose(hFile); if (hr != ERROR_NO_MORE_FILES) throw ref new Platform::Exception(hr, L"Error finding files"); return found; } Windows::Foundation::IAsyncOperation^ FilePerfTest::GetFileCountWin32Async() { return concurrency::create_async([this] { return GetFileCountWin32(); }); } 

Если я проведу это на своем Lumia 920 в режиме Release, чтобы получить 1000 файлов, версия Win32 займет менее 5 миллисекунд (быстрее, если вы используете не-асинхронную версию, и на этой скорости действительно не нужно быть асинхронным), тогда как использование StorageFolder.GetFilesAsync().Count занимает более 6 секунд .

Редактировать 7/1/15

Обратите внимание: если вы настроите таргетинг на приложения Windows Desktop, вы можете использовать метод StorageFolder.CreateFileQuery для создания массового запроса, и это должно быть быстрее. Но, к сожалению, он не поддерживается на телефоне 8.1