我正在移植现有的C ++应用程序(游戏引擎)以支持Windows Store 8和Windows Phone 8.1应用程序,我遇到了_wfindfirst功能的问题。在常规Win32上,它返回与模式匹配的第一个找到的元素的句柄。我们主要用它来获取有关目录或文件的信息。
我试图在WindowsPhone / Windows Store App上工作的功能是这样的:
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的相同结果吗?
答案 0 :(得分:0)
如果仍然相关,似乎您无法使用标准C ++函数访问应用程序沙箱(安装位置和本地应用程序文件夹)之外的文件系统。它们将因Access denied错误而失败。我认为它们的行为与CreateFile2的行为非常相似,并且根据MSDN:
从Windows应用商店应用调用时,简化了CreateFile2。您只能打开ApplicationData.LocalFolder或Package.InstalledLocation目录中的文件或目录。
在您的情况下,正如我所看到的,安装位置指向开发文件夹,我认为系统决定此位置不在您应用的沙箱中。
考虑使用Windows.Storage命名空间中的 Windows运行时API 。这些API可用于访问文件系统中的任何文件。