2015-04-28 3 views
3

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

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

+0

Вы только пытаетесь получить файлы из своего собственного изолированного каталога хранилища или пытаетесь получить их откуда-то еще (например, в библиотеке изображений или в библиотеке музыки)? –

+0

@ PeterTorr-MSFT: из LocalStorage приложения (изолировано), но хотелось бы узнать, насколько это возможно. – AbsoluteSith

+0

Существует нет прямого способа получить счет. Но поскольку эти файлы сохраняются приложением, вы можете отслеживать добавленные/удаленные файлы в localsettings и использовать для быстрого доступа, вы можете получить количество файлов из localSettings. PS локальное хранилище даже не предоставляет файл существует :(нужно получить доступ к файлу в try catch, чтобы проверить, существует ли файл или нет –

ответ

5

Вы можете получить более высокую производительность на 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

+0

Это хорошо, но мне было интересно, есть ли какой-либо другой метод для запроса в другом месте в файловой системе? Он даже не работал для ac: \ myfolder, и мне нужно запросить папка с файлами 35k :( – Pedrom

+0

К сожалению, нет поддерживаемого способа. Если это только для вашего собственного удовольствия (не что-то, что можно положить в магазин), вы можете попробовать ACL-в папку, чтобы дать доступ для чтения к 'ALL APPLICATION PACAKGES' ... но используйте на свой страх и риск, вероятно, не поддерживается и т. д. –

+0

Спасибо, что ответили! К сожалению, это то, что я хочу в конечном итоге опубликовать sh в магазине. То, что я закончил делать, это постепенно читать файлы в пакетах, но это не идеально. Это будет исправлено в Windows 10? – Pedrom

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