C# 从C以外的其他驱动器执行程序时拒绝访问: 我的设置如下:我有一个C++核心库(VisualC++项目在VisualStudio中)编译成一个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)); } }

C# 从C以外的其他驱动器执行程序时拒绝访问: 我的设置如下:我有一个C++核心库(VisualC++项目在VisualStudio中)编译成一个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)); } },c#,c++,visual-c++,C#,C++,Visual C++,路径预定义为在AppData目录中 我发现,如果我从C:驱动器执行,它可以正常工作。但是,如果我从另一个驱动器(例如,映射网络驱动器)执行,则在尝试创建文件夹时会出现“权限被拒绝”错误 我假设这是由于.NET运行时中的一些限制造成的,但是有没有一种方法可以配置它?最好是编译时配置,或者请求用户许可?我尝试过以管理员的身份运行,但没有任何区别 编辑: 添加了内部代码。 日志的输出是 Unable to make path: C:/Users/mattimmer/AppData/Roaming/My

路径预定义为在AppData目录中

我发现,如果我从C:驱动器执行,它可以正常工作。但是,如果我从另一个驱动器(例如,映射网络驱动器)执行,则在尝试创建文件夹时会出现“权限被拒绝”错误

我假设这是由于.NET运行时中的一些限制造成的,但是有没有一种方法可以配置它?最好是编译时配置,或者请求用户许可?我尝试过以管理员的身份运行,但没有任何区别

编辑: 添加了内部代码。 日志的输出是

Unable to make path: C:/Users/mattimmer/AppData/Roaming/MyApp/Assets (Permission denied)

终于找到了问题所在。我认为MKPATH是图书馆的一部分,所以我甚至不考虑去那里看,而实际上却没有。mkpath的实现将在路径中的文件夹中循环并调用
\u mkdir
。当从另一个驱动器运行时,第一步(本质上是
\u mkdir(“C:”)
)将失败,EACCES(权限被拒绝),但是所有后续路径都将成功。因此,我的解决方案是更改实现,这样即使EACCES失败,它也会继续尝试。

混淆基本代码对您没有帮助。传统的错误是意外地依赖默认驱动器和默认目录。始终使用完整路径,包括驱动器号。必须始终使用SHGetKnownFolderPath()或AppData环境变量检索用户AppData的路径。或者让您的.NET代码帮助处理Environment.GetFolderPath()。抱歉,目前我只是记录代码,对我来说,它不是关键部分,因为是mkpath失败了。我正在使用完整路径。我会更新我的问题。尝试用C++来制作这个问题。JabbWokky。谢谢。我做了一个,它让我意识到了什么是错的。