GetFileAttributes
From NSIS Wiki
Jump to navigationJump to search
Author: Instructor (talk, contrib) |
Page for NSIS 2.07 and below users
You can use the latest version of headers (recommended) or the following function code (put the function code in your script before calling it)
Function Description
____________________________________________________________________________ GetFileAttributes v1.2 ____________________________________________________________________________ Get attributes of file or directory. Syntax: ${GetFileAttributes} "[File]" "[Attributes]" $var "[File]" ; File or directory ; "[Attributes]" ; "ALL" (default) ; -all attributes of file combined with "|" to output ; ; "READONLY|HIDDEN|SYSTEM|DIRECTORY|ARCHIVE| ; DEVICE|NORMAL|TEMPORARY|SPARSE_FILE|REPARSE_POINT| ; COMPRESSED|OFFLINE|NOT_CONTENT_INDEXED|ENCRYPTED" ; -file must have specified attributes ; $var ; Result: ; $var=attr1|attr2|... (if used "ALL") ; $var=1 file has specified attributes ; $var=0 file has no specified attributes Note: -Error flag if file isn't exist
Example1:
Section ${GetFileAttributes} "C:\MSDOS.SYS" "ALL" $R0 ; $R0=READONLY|HIDDEN|SYSTEM|ARCHIVE SectionEnd
Example2:
Section ${GetFileAttributes} "C:\MSDOS.SYS" "SYSTEM|HIDDEN" $R0 ; $R0=1 SectionEnd
Example3:
Section ${GetFileAttributes} "C:\MSDOS.SYS" "NORMAL" $R0 ; $R0=0 SectionEnd
Function Code
Function GetFileAttributes !define GetFileAttributes `!insertmacro GetFileAttributesCall` !macro GetFileAttributesCall _PATH _ATTR _RESULT Push `${_PATH}` Push `${_ATTR}` Call GetFileAttributes Pop ${_RESULT} !macroend Exch $1 Exch Exch $0 Exch Push $2 Push $3 Push $4 Push $5 System::Call 'kernel32::GetFileAttributes(t r0)i .r2' StrCmp $2 -1 error StrCpy $3 '' IntOp $0 $2 & 0x4000 IntCmp $0 0 +2 StrCpy $3 'ENCRYPTED|' IntOp $0 $2 & 0x2000 IntCmp $0 0 +2 StrCpy $3 'NOT_CONTENT_INDEXED|$3' IntOp $0 $2 & 0x1000 IntCmp $0 0 +2 StrCpy $3 'OFFLINE|$3' IntOp $0 $2 & 0x0800 IntCmp $0 0 +2 StrCpy $3 'COMPRESSED|$3' IntOp $0 $2 & 0x0400 IntCmp $0 0 +2 StrCpy $3 'REPARSE_POINT|$3' IntOp $0 $2 & 0x0200 IntCmp $0 0 +2 StrCpy $3 'SPARSE_FILE|$3' IntOp $0 $2 & 0x0100 IntCmp $0 0 +2 StrCpy $3 'TEMPORARY|$3' IntOp $0 $2 & 0x0080 IntCmp $0 0 +2 StrCpy $3 'NORMAL|$3' IntOp $0 $2 & 0x0040 IntCmp $0 0 +2 StrCpy $3 'DEVICE|$3' IntOp $0 $2 & 0x0020 IntCmp $0 0 +2 StrCpy $3 'ARCHIVE|$3' IntOp $0 $2 & 0x0010 IntCmp $0 0 +2 StrCpy $3 'DIRECTORY|$3' IntOp $0 $2 & 0x0004 IntCmp $0 0 +2 StrCpy $3 'SYSTEM|$3' IntOp $0 $2 & 0x0002 IntCmp $0 0 +2 StrCpy $3 'HIDDEN|$3' IntOp $0 $2 & 0x0001 IntCmp $0 0 +2 StrCpy $3 'READONLY|$3' StrCpy $0 $3 -1 StrCmp $1 '' end StrCmp $1 'ALL' end attrcmp: StrCpy $5 0 IntOp $5 $5 + 1 StrCpy $4 $1 1 $5 StrCmp $4 '' +2 StrCmp $4 '|' 0 -3 StrCpy $2 $1 $5 IntOp $5 $5 + 1 StrCpy $1 $1 '' $5 StrLen $3 $2 StrCpy $5 -1 IntOp $5 $5 + 1 StrCpy $4 $0 $3 $5 StrCmp $4 '' notfound StrCmp $4 $2 0 -3 StrCmp $1 '' 0 attrcmp StrCpy $0 1 goto end notfound: StrCpy $0 0 goto end error: SetErrors StrCpy $0 '' end: Pop $5 Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 FunctionEnd