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