GetSize: Difference between revisions

From NSIS Wiki
Jump to navigationJump to search
m (Added category links.)
m (Updated by user: Instructor (talk, contrib).)
Line 7: Line 7:
: http://forums.winamp.com/showthread.php?s=&threadid=203228&goto=lastpost
: http://forums.winamp.com/showthread.php?s=&threadid=203228&goto=lastpost


If function used without header then put function in script before call it  
If a function is used without an header, you should put the function below in your script before calling it.


== The Function ==
== The Function ==
Line 16: Line 16:
____________________________________________________________________________
____________________________________________________________________________


2004 Shengalts Aleksander (Shengalts@mail.ru)
Thanks KiCHiK (Function "FindFiles")


Thanks KiCHiK (Function "FindFiles")


Features:
Features:
1. Find the size of a file, files mask or directory
1. Find the size of a file, files mask or directory.
2. Find the sum of the files, directories and subdirectories
2. Find the sum of the files, directories and subdirectories.
 


Syntax:
Syntax:
${GetSize} "[Path]" "[Options]" $var1 $var2 $var3


Push "[Path]"      ; [Path]
"[Path]"      ; Disk or Directory
                  ;    Disk or Directory
              ;
Push "[Options]"  ; /M=[mask]
"[Options]"  ; /M=[mask]
                  ;    /M=*.*        - Find all (default)
              ;    /M=*.*        - Find all (default)
                  ;    /M=*.doc      - Find Work.doc, 1.doc ...
              ;    /M=*.doc      - Find Work.doc, 1.doc ...
                  ;    /M=Pho*        - Find PHOTOS, phone.txt ...
              ;    /M=Pho*        - Find PHOTOS, phone.txt ...
                  ;    /M=win???.exe  - Find winamp.exe, winver.exe ...
              ;    /M=win???.exe  - Find winamp.exe, winver.exe ...
                  ;    /M=winamp.exe  - Find winamp.exe only
              ;    /M=winamp.exe  - Find winamp.exe only
                  ; /S=No:No[B|K|M|G]
              ; /S=No:No[B|K|M|G]
                  ;    /S=      - Don't find file size (faster) (default)
              ;    /S=      - Don't find file size (faster) (default)
                  ;    /S=0:0B  - Find only files of 0 Bytes exactly
              ;    /S=0:0B  - Find only files of 0 Bytes exactly
                  ;    /S=5:9K  - Find only files of 5 to 9 Kilobytes
              ;    /S=5:9K  - Find only files of 5 to 9 Kilobytes
                  ;    /S=:10M  - Find only files of 10 Megabyte or less
              ;    /S=:10M  - Find only files of 10 Megabyte or less
                  ;    /S=1G    - Find only files of 1 Gigabyte or more
              ;    /S=1G    - Find only files of 1 Gigabyte or more
                  ; /G=[1|0]
              ; /G=[1|0]
                  ;    /G=1    - Find with subdirectories (default)
              ;    /G=1    - Find with subdirectories (default)
                  ;    /G=0    - Find without subdirectories
              ;    /G=0    - Find without subdirectories
                  ;
              ;
Call GetSize      ;
$var1         ; Result1: Size
                  ;
$var2         ; Result2: Sum of files
Pop $var1         ;   Size
$var3         ; Result3: Sum of directories
Pop $var2         ;   Sum of files
Pop $var3         ;   Sum of directories




Line 61: Line 60:
; Find file size "C:\WINDOWS\Explorer.exe" in kilobytes
; Find file size "C:\WINDOWS\Explorer.exe" in kilobytes


Push "C:\WINDOWS"
${GetSize} "C:\WINDOWS" "/M=Explorer.exe /S=0K /G=0" $0 $1 $2
Push "/M=Explorer.exe /S=0K /G=0"
; $0="220" Kb
Call GetSize
; $1="1"  files
Pop $0  ; $0="220" Kb
; $2=""    directories
Pop $1  ; $1="1"  files
Pop $2  ; $2=""    directories


IfErrors 0 +2
IfErrors 0 +2
Line 76: Line 73:
; Find folder size "C:\Installs\Reanimator\Drivers" in megabytes
; Find folder size "C:\Installs\Reanimator\Drivers" in megabytes


Push "C:\Installs\Reanimator\Drivers"
${GetSize} "C:\Installs\Reanimator\Drivers" "/S=0M" $0 $1 $2
Push "/S=0M"
; $0="132" Mb
Call GetSize
; $1="555" files
Pop $0  ; $0="132" Mb
; $2="55"  directories
Pop $1  ; $1="555" files
Pop $2  ; $2="55"  directories


IfErrors 0 +2
IfErrors 0 +2
Line 91: Line 86:
; Find sum of files and folders "C:\WINDOWS" (no subfolders)
; Find sum of files and folders "C:\WINDOWS" (no subfolders)


Push "C:\WINDOWS"
${GetSize} "C:\WINDOWS" "/G=0" $0 $1 $2
Push "/G=0"
; $0=""    size
Call GetSize
; $1="253" files
Pop $0  ; $0=""    size
; $2="46"  directories
Pop $1  ; $1="253" files
Pop $2  ; $2="46"  directories


IfErrors 0 +2
IfErrors 0 +2
Line 104: Line 97:


;---------------------------------------------------------------------------
;---------------------------------------------------------------------------
Function GetSize
Function GetSize
!define GetSize `!insertmacro GetSizeCall`
!macro GetSizeCall _PATH _OPTIONS _RESULT1 _RESULT2 _RESULT3
Push `${_PATH}`
Push `${_OPTIONS}`
Call GetSize
Pop ${_RESULT1}
Pop ${_RESULT2}
Pop ${_RESULT3}
!macroend
Exch $1
Exch $1
Exch
Exch
Line 126: Line 131:
ClearErrors
ClearErrors


StrCpy $R9 $0 '' -1
StrCpy $R9 $0 1 -1
StrCmp $R9 '\' 0 +3
StrCmp $R9 '\' 0 +3
StrCpy $0 $0 -1
StrCpy $0 $0 -1
Line 148: Line 153:
StrCmp $R9 '/' 0 -4
StrCmp $R9 '/' 0 -4


StrCpy $9 0
StrCpy $9 -1
IntOp $9 $9 + 1
StrCpy $R9 $1 1 $9
StrCpy $R9 $1 1 $9
StrCmp $R9 '' +4
StrCmp $R9 '' +2
StrCmp $R9 '/' +3
StrCmp $R9 '/' 0 -3
IntOp $9 $9 + 1
goto -4
StrCpy $8 $1 $9
StrCpy $8 $1 $9
StrCpy $8 $8 '' 2
StrCpy $8 $8 '' 2

Revision as of 09:40, 24 June 2005

Author: Instructor (talk, contrib)


Links

Latest version of headers "nsh.zip"
http://forums.winamp.com/showthread.php?s=&threadid=203228&goto=lastpost

If a function is used without an header, you should put the function below in your script before calling it.

The Function

/*
____________________________________________________________________________
 
                            GetSize v1.8
____________________________________________________________________________
 
Thanks KiCHiK (Function "FindFiles")
 
 
Features:
1. Find the size of a file, files mask or directory.
2. Find the sum of the files, directories and subdirectories.
 
 
Syntax:
${GetSize} "[Path]" "[Options]" $var1 $var2 $var3
 
"[Path]"      ; Disk or Directory
              ;
"[Options]"   ; /M=[mask]
              ;     /M=*.*         - Find all (default)
              ;     /M=*.doc       - Find Work.doc, 1.doc ...
              ;     /M=Pho*        - Find PHOTOS, phone.txt ...
              ;     /M=win???.exe  - Find winamp.exe, winver.exe ...
              ;     /M=winamp.exe  - Find winamp.exe only
              ; /S=No:No[B|K|M|G]
              ;     /S=      - Don't find file size (faster) (default)
              ;     /S=0:0B  - Find only files of 0 Bytes exactly
              ;     /S=5:9K  - Find only files of 5 to 9 Kilobytes
              ;     /S=:10M  - Find only files of 10 Megabyte or less
              ;     /S=1G    - Find only files of 1 Gigabyte or more
              ; /G=[1|0]
              ;     /G=1     - Find with subdirectories (default)
              ;     /G=0     - Find without subdirectories
              ;
$var1         ; Result1: Size
$var2         ; Result2: Sum of files
$var3         ; Result3: Sum of directories
 
 
Note:
-Error flag if disk or directory isn't exist
-Error flag if syntax error
 
 
 
Example (1):
Section
	; Find file size "C:\WINDOWS\Explorer.exe" in kilobytes
 
	${GetSize} "C:\WINDOWS" "/M=Explorer.exe /S=0K /G=0" $0 $1 $2
	; $0="220" Kb
	; $1="1"   files
	; $2=""    directories
 
	IfErrors 0 +2
	MessageBox MB_OK "Error"
SectionEnd
 
Example (2):
Section
	; Find folder size "C:\Installs\Reanimator\Drivers" in megabytes
 
	${GetSize} "C:\Installs\Reanimator\Drivers" "/S=0M" $0 $1 $2
	; $0="132" Mb
	; $1="555" files
	; $2="55"  directories
 
	IfErrors 0 +2
	MessageBox MB_OK "Error"
SectionEnd
 
Example (3):
Section
	; Find sum of files and folders "C:\WINDOWS" (no subfolders)
 
	${GetSize} "C:\WINDOWS" "/G=0" $0 $1 $2
	; $0=""    size
	; $1="253" files
	; $2="46"  directories
 
	IfErrors 0 +2
	MessageBox MB_OK "Error"
SectionEnd*/
 
 
;---------------------------------------------------------------------------
 
Function GetSize
	!define GetSize `!insertmacro GetSizeCall`
 
	!macro GetSizeCall _PATH _OPTIONS _RESULT1 _RESULT2 _RESULT3
		Push `${_PATH}`
		Push `${_OPTIONS}`
		Call GetSize
		Pop ${_RESULT1}
		Pop ${_RESULT2}
		Pop ${_RESULT3}
	!macroend
 
	Exch $1
	Exch
	Exch $0
	Exch
	Push $2
	Push $3
	Push $4
	Push $5
	Push $6
	Push $7
	Push $8
	Push $9
	Push $R3
	Push $R4
	Push $R5
	Push $R6
	Push $R7
	Push $R8
	Push $R9
	ClearErrors
 
	StrCpy $R9 $0 1 -1
	StrCmp $R9 '\' 0 +3
	StrCpy $0 $0 -1
	goto -3
	IfFileExists '$0\*.*' 0 error
 
	StrCpy $3 ''
	StrCpy $4 ''
	StrCpy $5 ''
	StrCpy $6 ''
	StrCpy $8 0
	StrCpy $R3 ''
	StrCpy $R4 ''
	StrCpy $R5 ''
 
	option:
	StrCpy $R9 $1 1
	StrCpy $1 $1 '' 1
	StrCmp $R9 ' ' -2
	StrCmp $R9 '' sizeset
	StrCmp $R9 '/' 0 -4
 
	StrCpy $9 -1
	IntOp $9 $9 + 1
	StrCpy $R9 $1 1 $9
	StrCmp $R9 '' +2
	StrCmp $R9 '/' 0 -3
	StrCpy $8 $1 $9
	StrCpy $8 $8 '' 2
	StrCpy $R9 $8 '' -1
	StrCmp $R9 ' ' 0 +3
	StrCpy $8 $8 -1
	goto -3
	StrCpy $R9 $1 2
	StrCpy $1 $1 '' $9
 
	StrCmp $R9 'M=' 0 size
	StrCpy $4 $8
	goto option
 
	size:
	StrCmp $R9 'S=' 0 gotosubdir
	StrCpy $6 $8
	goto option
 
	gotosubdir:
	StrCmp $R9 'G=' 0 error
	StrCpy $7 $8
	StrCmp $7 '' +3
	StrCmp $7 '1' +2
	StrCmp $7 '0' 0 error
	goto option
 
	sizeset:
	StrCmp $6 '' default
	StrCpy $9 0
	StrCpy $R9 $6 1 $9
	StrCmp $R9 '' +4
	StrCmp $R9 ':' +3
	IntOp $9 $9 + 1
	goto -4
	StrCpy $5 $6 $9
	IntOp $9 $9 + 1
	StrCpy $1 $6 1 -1
	StrCpy $6 $6 -1 $9
	StrCmp $5 '' +2
	IntOp $5 $5 + 0
	StrCmp $6 '' +2
	IntOp $6 $6 + 0
 
	StrCmp $1 'B' 0 +4
	StrCpy $1 1
	StrCpy $2 bytes
	goto default
	StrCmp $1 'K' 0 +4
	StrCpy $1 1024
	StrCpy $2 Kb
	goto default
	StrCmp $1 'M' 0 +4
	StrCpy $1 1048576
	StrCpy $2 Mb
	goto default
	StrCmp $1 'G' 0 error
	StrCpy $1 1073741824
	StrCpy $2 Gb
 
	default:
	StrCmp $4 '' 0 +2
	StrCpy $4 '*.*'
	StrCmp $7 '' 0 +2
	StrCpy $7 '1'
 
	StrCpy $8 1
	Push $0
	SetDetailsPrint textonly
 
	nextdir:
	IntOp $8 $8 - 1
	Pop $R8
	FindFirst $0 $R7 '$R8\$4'
	IfErrors show
	StrCmp $R7 '.' 0 +5
	FindNext $0 $R7
	StrCmp $R7 '..' 0 +3
	FindNext $0 $R7
	IfErrors show
 
	dir:
	IfFileExists '$R8\$R7\*.*' 0 file
	IntOp $R5 $R5 + 1
	goto findnext
 
	file:
	StrCpy $R6 0
	StrCmp $5$6 '' 0 +3
	IntOp $R4 $R4 + 1
	goto findnext
	FileOpen $9 '$R8\$R7' r
	IfErrors +3
	FileSeek $9 0 END $R6
	FileClose $9
	StrCmp $5 '' +2
	IntCmp $R6 $5 0 findnext
	StrCmp $6 '' +2
	IntCmp $R6 $6 0 0 findnext
	IntOp $R4 $R4 + 1
	System::Int64Op $R3 + $R6
	Pop $R3
 
	findnext:
	FindNext $0 $R7
	IfErrors 0 dir
	FindClose $0
 
	show:
	StrCmp $5$6 '' nosize
	System::Int64Op $R3 / $1
	Pop $9
	DetailPrint 'Size:$9 $2  Files:$R4  Folders:$R5'
	goto subdir
	nosize:
	DetailPrint 'Files:$R4  Folders:$R5'
 
	subdir:
	StrCmp $7 0 preend
	FindFirst $0 $R7 '$R8\*.*'
	StrCmp $R7 '.' 0 +5
	FindNext $0 $R7
	StrCmp $R7 '..' 0 +3
	FindNext $0 $R7
	IfErrors +7
 
	IfFileExists '$R8\$R7\*.*' 0 +3
	Push '$R8\$R7'
	IntOp $8 $8 + 1
	FindNext $0 $R7
	IfErrors 0 -4
	FindClose $0
	StrCmp $8 0 0 nextdir
 
	preend:
	StrCmp $R3 '' nosizeend
	System::Int64Op $R3 / $1
	Pop $R3
	nosizeend:
	StrCpy $2 $R4
	StrCpy $1 $R5
	StrCpy $0 $R3
	goto end
 
	error:
	SetErrors
	StrCpy $0 ''
	StrCpy $1 ''
	StrCpy $2 ''
 
	end:
	SetDetailsPrint both
	Pop $R9
	Pop $R8
	Pop $R7
	Pop $R6
	Pop $R5
	Pop $R4
	Pop $R3
	Pop $9
	Pop $8
	Pop $7
	Pop $6
	Pop $5
	Pop $4
	Pop $3
	Exch $2
	Exch
	Exch $1
	Exch 2
	Exch $0
FunctionEnd