我的设置如下:我有一个用C ++(Visual Studio中的Visual C ++项目)编写的核心库,可以编译成DLL,并且我有一个使用该DLL的C#项目。核心库使用磁盘访问来保持持久性,例如类似于:
std::string path = ...;
if (access(path.c_str(), F_OK) == -1) {
if (mkpath(path.c_str()) == -1) {
Log::Message(WARN, "Unable to make path: %s (%s)\n", path.c_str(), strerror(errno));
}
}
该路径已预定义为位于AppData目录中。
我发现,如果我从C:驱动器执行,但是如果我从另一个驱动器(例如映射的网络驱动器,尝试创建该文件夹时出现“权限被拒绝”错误。
我认为这是由于.NET运行时中的某些限制所致,但是有没有一种我可以配置它的方法-最好是编译时还是通过询问用户权限?我尝试过以管理员身份运行,但这没什么区别。
编辑: 添加了内部代码。 日志的输出是
Unable to make path: C:/Users/mattimmer/AppData/Roaming/MyApp/Assets (Permission denied)
答案 0 :(得分:0)
最终设法找出问题所在。我以为mkpath是图书馆的一部分,所以我什至没有考虑在那儿看,而实际上却不是。 mkpath的实现将遍历路径中的文件夹并调用_mkdir
。当从另一个驱动器运行时,第一步(本质上是_mkdir("C:")
)将因EACCES(权限被拒绝)而失败,但是所有后续路径都将成功。因此,我的解决方案是更改实现,以便即使EACCES失败也可以继续尝试。