GetFileAttributes

From NSIS Wiki
Revision as of 12:09, 30 November 2005 by Instructor (talk | contribs)
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.1
____________________________________________________________________________
 
 
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 - 16384
	IntCmp $0 0 0 +4
	StrCpy $3 'ENCRYPTED|'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 8192
	IntCmp $0 0 0 +4
	StrCpy $3 'NOT_CONTENT_INDEXED|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 4096
	IntCmp $0 0 0 +4
	StrCpy $3 'OFFLINE|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 2048
	IntCmp $0 0 0 +4
	StrCpy $3 'COMPRESSED|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 1024
	IntCmp $0 0 0 +4
	StrCpy $3 'REPARSE_POINT|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 512
	IntCmp $0 0 0 +4
	StrCpy $3 'SPARSE_FILE|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 256
	IntCmp $0 0 0 +4
	StrCpy $3 'TEMPORARY|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 128
	IntCmp $0 0 0 +4
	StrCpy $3 'NORMAL|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 64
	IntCmp $0 0 0 +4
	StrCpy $3 'DEVICE|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 32
	IntCmp $0 0 0 +4
	StrCpy $3 'ARCHIVE|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 16
	IntCmp $0 0 0 +4
	StrCpy $3 'DIRECTORY|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 4
	IntCmp $0 0 0 +4
	StrCpy $3 'SYSTEM|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 2
	IntCmp $0 0 0 +4
	StrCpy $3 'HIDDEN|$3'
	StrCpy $2 $0
	StrCmp $2 0 all
 
	IntOp $0 $2 - 1
	StrCpy $3 'READONLY|$3'
 
	all:
	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