_findfirst和WinRT访问被拒绝
_findfirst and WinRT access denied
我正在移植现有的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可以用来访问文件系统中的任何文件。
- 访问被拒绝后,c++中的故障保护代码
- 删除目录函数访问被拒绝
- 为什么 Windows 拒绝访问某些进程的名称?
- 我在执行任何程序时被拒绝在 devcpp 中访问
- Windows C++:文件夹移动访问被拒绝错误
- AWS AMI 中的 Windows DPAPI 失败,访问被拒绝
- C++ 17 文件系统copy_file访问被拒绝
- mysql c ++连接器异常:用户"root"@'localhost'的访问被拒绝(使用密码:NO)&&MySQL服务器已消失
- 如何修复 CopyFile() 错误 5 - 访问被拒绝错误
- 任务计划程序:设置运行级别时拒绝访问
- 清除同一属性后,设置属性时拒绝访问
- 创建注册表密钥 - 拒绝访问
- 64位Windows API结构对齐导致命名管道上出现“拒绝访问”错误
- RegLoadKey给出错误代码5(拒绝访问)
- 在正常应用程序中,当信号量第一次由服务创建时,它被拒绝访问
- 当发生错误(拒绝访问)时调用Curl-headerfunction和write函数
- 在EnumProcessModules上拒绝访问- c++
- 无法启动程序:拒绝访问
- 拒绝访问nt权限本地服务
- OpenFileMapping在某些前任中被拒绝访问