获取StorageFolder中的文件数量

时间:2015-04-28 00:38:22

标签: c# windows-runtime windows-phone-8.1

我正在使用Windows Phone 8.1(RT)应用程序,我想知道如何获取 StorageFolder中的文件数

我知道我们可以使用StorageFolder.GetFilesAsync(),然后检查返回的此列表的计数。 但是,由于这种方法花费的时间太长并且返回所有项目,是否有更有效的方法来完成这项工作?

1 个答案:

答案 0 :(得分:5)

如果使用Win32 API获取文件数量,性能可以提高3个数量级,但它仅适用于您的本地存储目录(它不适用于图片或音乐等代理位置)。例如,给定以下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上进行测试以获得1,000个文件,则Win32版本需要不到5 毫秒(如果使用非异步,则更快)版本,并且在那个速度下,真的不需要异步)而使用StorageFolder.GetFilesAsync().Count需要超过6

编辑7/1/15

请注意,如果您要定位Windows桌面应用,则可以使用StorageFolder.CreateFileQuery方法创建批量查询,这应该更快。但不幸的是,它不支持Phone 8.1