如何使用FileCopy()重置文件属性

时间:2011-05-25 10:05:18

标签: inno-setup

我使用Filecopy()函数从CDROM媒体复制文件,似乎复制了READONLY属性,导致重新安装问题。

如何删除只读属性?

1 个答案:

答案 0 :(得分:4)

内置的support functions没有执行此操作的例程。

所以它归结为其他几个选项之一。

  1. 您可以使用ShellExecute
  2. 致电attrib -r C:\path\FileName.txt
  3. 您可以将功能构建到DLL中并导入DLL
  4. 您可以使用COM对象执行此操作
  5. 直接调用Windows API。 <强>已更新
  6. 以下是使用COM

    执行此操作的示例函数
    procedure RemoveReadOnly(FileSpec : String);
    var
     FSO : Variant;
     File : Variant;
    begin
     FSO := CreateOleObject('Scripting.FileSystemObject');
     File := FSO.GetFile(FileSpec);
     if File.attributes and 1 then // Check if Readonly already
        File.attributes := File.attributes - 1;
    end;
    

    MSDN包含FilesSystemObject上的文档以及Attributes的使用。

    <强>已更新

    以下是直接调用Windows API的示例,这是最佳选择。

    function GetFileAttributes(lpFileName: PAnsiChar): DWORD;
     external 'GetFileAttributesA@kernel32.dll stdcall';
    
    function SetFileAttributes(lpFileName: PAnsiChar; 
       dwFileAttributes: DWORD): BOOL; 
    external 'SetFileAttributesA@kernel32.dll stdcall';
    
    procedure RemoveReadOnly(FileName : String);
    var
     Attr : DWord;
    begin
      Attr := GetFileAttributes(FileName);
      if (Attr and 1) = 1  then          
      begin
        Attr := Attr -1;
        SetFileAttributes(FileName,Attr);
      end;
    end;