_findfirst和WinRT访问被拒绝

_findfirst and WinRT access denied

本文关键字:拒绝 访问 WinRT findfirst      更新时间:2023-10-16

我正在移植现有的c++应用程序(游戏引擎),以支持Windows Store 8和Windows Phone 8.1应用程序,我有_wfindfirst函数的问题。在常规Win32上,它返回一个句柄,指向第一个找到的匹配模式的元素。我们主要使用它来获取目录或文件的信息。

我想在WindowsPhone/Windows Store应用程序上工作的功能是这样的:

bool sys_GetFileInfo(const std::string& path, FileInfo* info) {
  ...
  long handle = _wfindfirst(p.c_str(), &item); // path gets converted to wstring
  if (handle != -1L) {
    info->size = (item.attrib & _A_SUBDIR) ? -1 : item.size;
    info->modifiedAt = item.time_write;
    _findclose(handle);
    return true;
  }
  ...
}

所以它被用来检索文件大小和修改日期(如果它恰好是目录,大小被设置为-1)

第一个用途是获取有关exe的工作目录的信息,因此在WinRT/WP/WS的情况下,我使用

提供的路径来使用它
std::wstring wpath = Windows::ApplicationModel::Package::Current->InstalledLocation->Path->Data();

本例中的路径为:

 wpath = L"C:\foo\winrt\winrt\Debug\foo_winrt.Windows\AppX"

问题是它总是返回-1,当我用GetLastError()代码检查错误字符串时,我得到了拒绝访问的错误。这很令人困惑,因为在我的理解中应用程序应该对这个位置有读访问所以_wfindfirst是一个读操作,对吧?在Win32上,它在给定常规目录路径下工作。

为什么这个函数失败?是否有其他可行的选择来实现WinRT的相同结果?

如果仍然相关,似乎您无法使用标准c++函数访问应用程序沙箱外的文件系统(安装位置和本地应用程序文件夹)。它们将失败,并出现拒绝访问错误。我认为它们的行为与CreateFile2的行为非常相似,根据MSDN:

当从Windows Store应用调用时,CreateFile2被简化了。您只能打开ApplicationData中的文件或目录。LocalFolder或Package。InstalledLocation目录。

在你的情况下,正如我所看到的,安装位置指向一个开发文件夹,我认为系统决定这个位置不在你的应用程序的沙盒内。

考虑使用Windows运行时api 。存储名称空间。这些api可以用来访问文件系统中的任何文件。