Inno setup Inno设置代码部分创建隐藏文件

Inno setup Inno设置代码部分创建隐藏文件,inno-setup,pascalscript,Inno Setup,Pascalscript,我正在处理一个inno安装项目。项目正在使用[Code]部分中的SaveStringToFile函数写出一个文件。我想使这个文件成为一个隐藏的系统文件,但我还没有找到如何使它工作的信息。有什么想法吗?Inno Setup Pascal脚本中没有设置文件属性的功能。因此,要么您必须导入可以设置文件属性的Windows API函数,要么使用以下技巧。您可以创建一个空文件,将其设置为隐藏在脚本条目中,然后您可以在其中写入任何需要的内容,因此安装过程将为您创建一个隐藏文件: [Setup] AppNam

我正在处理一个inno安装项目。项目正在使用[Code]部分中的SaveStringToFile函数写出一个文件。我想使这个文件成为一个隐藏的系统文件,但我还没有找到如何使它工作的信息。有什么想法吗?

Inno Setup Pascal脚本中没有设置文件属性的功能。因此,要么您必须导入可以设置文件属性的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;
[代码]
#ifdef UNICODE
#定义AW“W”
#否则
#定义“A”
#恩迪夫
常数
无效的\u文件\u属性=$FFFFFFFF;
函数GetFileAttributes(lpFileName:string):DWORD;
外部“GetFileAttributes{#AW}@kernel32.dll stdcall”;
函数SetFileAttributes(lpFileName:string;dwFileAttributes:DWORD):BOOL;
外部“SetFileAttributes{#AW}@kernel32.dll stdcall”;
程序审查;
变量
最后一个错误:LongInt;
开始
LastError:=DLLGetLastError;
RaiseException(格式('系统错误。代码:%d.%s',[LastError,
SysErrorMessage(LastError)]);
结束;
过程SetFileHiddenAttr(常量文件名:字符串);
变量
属性:德沃德;
开始
Attrs:=GetFileAttributes(文件名);
如果属性无效,则
开始
如果属性和文件属性为0,则
如果未设置文件属性(文件名、属性或文件属性隐藏),则
赖斯·塞罗;
结束
其他的
赖斯·塞罗;
结束;

这太完美了。我曾想过做这样的事情,但没能搞清楚所有的后勤工作。后安装是我需要的。我真的很喜欢这样,因为文件也由卸载过程处理。谢谢不客气!我还添加了一个函数,它可以显式地将隐藏属性包含到文件中。但我个人更喜欢第一个选项,主要是因为文件包含在卸载程序中,如您所述。