在C:\ Program Files(x86)\ MyApp \ myapp.cfg中写configuration文件,与pipe理员权限

我已经为我的软件做了一个安装程序(使用Inno Setup)

C:\Program Files (x86)\MyApp\myapp.exe 

像往常一样在Windows平台上,它的工作完美。

当我的软件试图在这里写下它的configuration文件时出现问题:

 C:\Program Files (x86)\MyApp\myapp.cfg 

这里的Permission denied错误到达!

我find的唯一解决scheme是“以pipe理员身份运行软件”,但我不喜欢这个解决scheme:我不想让最终用户每次使用该软件都必须“以pipe理员身份运行”。

有没有一个干净的解决scheme,有权在C:\Program Files (x86)\MyApp\myapp.cfg而不要求最终用户“以pipe理员身份运行”?

正如@TLama所说,永远不要试图写入应用程序文件夹。 这是从来没有推荐的做法,因为微软Vista已经禁用它(首先允许你写,但实际上重定向到另一个目录,在后来的操作系统版本似乎已被删除的功能 – 也是好东西,因为它是支持地狱般)。

要检索已知的文件夹路径,请使用SHGetFolderPath函数。 根据应用程序数据是在所有用户之间共享还是仅由运行该应用程序的用户使用,应分别使用CSIDL_COMMON_APPDATACSIDL_LOCAL_APPDATA调用SHGetFolderPath 。 避免直接在这些文件夹中书写,而是创建像<your company>\<your app>这样的子文件夹,然后使用它们。

请注意, SHGetFolderPath已经被弃用,并且SHGetKnownFolderPath应该被用来代替它,但是只有当你不需要与Vista之前的Windows版本兼容时。

为了完整起见, 这个线程还描述了如何将SHGetFolderPath导入Python。

更新:更正,以避免使用环境变量和SHGetFolderPath而不是@RemyLebeau @TLama的评论