我正在使用Inno安装程序来构建我的安装程序,我在C:\Users\Public
部分中对[Files]
文件夹进行了硬编码以放置一些文件(Inno安装程序没有此文件夹的常量)
我的目标是让安装创建一个包含一些文件的C:\Users\Public\MyApp
文件夹。但是当我运行安装时,它在这里创建文件夹:
C:\Users\Public\Public Documents\MyApp
这是权限问题,安装程序无权直接在C:\Users\Public
下创建文件夹吗?
[Files]
Source: "MyApp\db.mdf"; DestDir: "{drive:{src}}\Users\Public\MyApp"; Flags: ignoreversion;
答案 0 :(得分:5)
我无法重现你的问题。对我来说,你的代码有效。我已在Windows Vista,7和10上对其进行了测试。它始终安装到C:\Users\Public\MyApp
。
虽然我不理解{drive:{src}}
。 Users
文件夹的驱动器如何与安装程序的驱动器相关联?您应该使用{sd}
constant:
[Files]
Source: "MyApp\db.mdf"; DestDir: "{sd}\Users\Public\MyApp"; Flags: ignoreversion
但无论如何,要解析C:\Users\Public
的路径,您可以使用PUBLIC
环境变量:
[Files]
Source: "MyApp\db.mdf"; DestDir: "{%PUBLIC}\MyApp"; Flags: ignoreversion
自Windows Vista以来一直有效。
或者,您可以将SHGetKnownFolderPath
与FOLDERID_Public
一起使用。有关示例代码,请参阅Constant for AppData\LocalLow?
如果你甚至需要支持没有C:\Users\Public
文件夹或PUBLIC
变量的Windows XP,你必须找出你需要在那里使用的路径(可能是{{1} }),并使用脚本常量实现回退:
C:\Documents and Settings\All Users
对于其他人而言,值得注意的是,您对解决问题的需求[Files]
Source: "MyProg.exe"; DestDir: "{code:GetPublicPath}\MyApp"; Flags: ignoreversion
[Code]
function GetPublicPath(Param: string): string;
begin
Result := GetEnv('PUBLIC');
if Result <> '' then
begin
Log(Format('PUBLIC is "%s"', [Result]));
end
else
begin
Result := GetEnv('ALLUSERSPROFILE');
Log(Format('PUBLIC is not set, ALLUSERSPROFILE is "%s"', [Result]));
end;
end;
非常具体,与此问题相关:C++ app MDB in ProgramData copies to user's AppData folder when I dont want it to。
通常不希望C:\Users\Public
,但C:\Users\Public
(= {commondocs}
)或C:\Users\Public\Documents
又名C:\ProgramData
(= {commonappdata}
)。