Inno Setup Code部分创建隐藏文件

时间:2014-03-27 18:42:27

标签: inno-setup pascalscript

我正在使用一个inno安装项目。该项目使用[Code]部分中的SaveStringToFile函数写出文件。我想将此文件设为隐藏的系统文件,但我无法找到有关如何使其工作的信息。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

在Inno Setup Pascal Script中没有设置文件属性的功能。因此,要么必须导入可以设置文件属性的Windows API函数,要么使用以下技巧。您可以创建一个空文件,您将其设置为隐藏在脚本条目中,然后您可以在那里编写任何需要的内容,因此安装过程将为您创建一个隐藏文件:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
; MyFile.txt is an empty text file
Source: "MyFile.txt"; DestDir: "{app}"; Attribs: hidden; AfterInstall: WriteToFile

[Code]
procedure WriteToFile;
begin
  SaveStringToFile(ExpandConstant('{app}\MyFile.txt'), 'Hello!', True);
end;

为了完整性,我还包括一个函数,您可以通过该函数将隐藏属性显式设置为文件:

[Code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif

const
  INVALID_FILE_ATTRIBUTES = $FFFFFFFF;

function GetFileAttributes(lpFileName: string): DWORD;
  external 'GetFileAttributes{#AW}@kernel32.dll stdcall';
function SetFileAttributes(lpFileName: string; dwFileAttributes: DWORD): BOOL;
  external 'SetFileAttributes{#AW}@kernel32.dll stdcall';

procedure RaiseLastOSError;
var
  LastError: LongInt;
begin
  LastError := DLLGetLastError;
  RaiseException(Format('System Error. Code: %d. %s', [LastError,
    SysErrorMessage(LastError)]));
end;

procedure SetFileHiddenAttr(const FileName: string);
var
  Attrs: DWORD;
begin
  Attrs := GetFileAttributes(FileName);
  if Attrs <> INVALID_FILE_ATTRIBUTES then
  begin
    if Attrs and FILE_ATTRIBUTE_HIDDEN = 0 then
      if not SetFileAttributes(FileName, Attrs or FILE_ATTRIBUTE_HIDDEN) then
        RaiseLastOSError;
  end
  else
    RaiseLastOSError;
end;