Вы можете получить более высокую производительность на 3 порядка, если вы используете Win32 API для получения количества файлов, но он работает только в вашем локальном каталоге хранилища (он не будет работать для брокерских мест, таких как Pictures или Music). Например, учитывая следующее C++/CX компонент:
Заголовок
public ref struct FilePerfTest sealed
{
Windows::Foundation::IAsyncOperation<uint32>^ 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<uint32>^ 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
Вы только пытаетесь получить файлы из своего собственного изолированного каталога хранилища или пытаетесь получить их откуда-то еще (например, в библиотеке изображений или в библиотеке музыки)? –
@ PeterTorr-MSFT: из LocalStorage приложения (изолировано), но хотелось бы узнать, насколько это возможно. – AbsoluteSith
Существует нет прямого способа получить счет. Но поскольку эти файлы сохраняются приложением, вы можете отслеживать добавленные/удаленные файлы в localsettings и использовать для быстрого доступа, вы можете получить количество файлов из localSettings. PS локальное хранилище даже не предоставляет файл существует :(нужно получить доступ к файлу в try catch, чтобы проверить, существует ли файл или нет –