CheckSpaceFree: Difference between revisions
Line 35: | Line 35: | ||
section - | section - | ||
StrCpy $0 12345; kb u need | StrCpy $0 12345 ; kb u need | ||
StrCpy $1 'c:' ; check drive c: for space | StrCpy $1 'c:' ; check drive c: for space | ||
Call CheckSpaceFunc | Call CheckSpaceFunc |
Revision as of 09:31, 3 February 2010
Author: sunjammer (talk, contrib) |
Description
I wrote this example for forum user cooladn. In the end it wasn't needed but someone may find it useful. It's yet another demonstration of the usefulness of the System plugin that Brainsucker wrote for NSIS. This example checks to see if a given disk has the desired amount of free space:
Notes
Please, please, please do not CheckSpaceFree on "c:\" when you want to CheckSpaceFree on "$INSTDIR".
You need to know the capacity of the volume that the specified directory is in. This may not be the volume at the "root of the drive" (e.g. "d:\") because of the use of mount points. If you don't know what mount points are then you should find out before writing installers that look at disk space. You might even use them yourself :-) In simple terms, a system could have a drive on which stuff is stored; Instead of being accessed as d:\, it could be accessed as c:\stuff. So, if I want to install your program into c:\stuff, you should CheckSpaceFree there and not abort because I don't have enough space on c:\.
The Script
OutFile "FreeSpace.exe" !define sysGetDiskFreeSpaceEx 'kernel32::GetDiskFreeSpaceExA(t, *l, *l, *l) i' ; $0 - space required in kb ; $1 - path to check ; $2 - 0 = ignore quotas, 1 = obey quotas ; trashes $2 function CheckSpaceFunc IntCmp $2 0 ignorequota ; obey quota System::Call '${sysGetDiskFreeSpaceEx}(r1,.r2,,.)' goto converttokb ; ignore quota ignorequota: System::Call '${sysGetDiskFreeSpaceEx}(r1,.,,.r2)' converttokb: ; convert the large integer byte values into managable kb System::Int64Op $2 / 1024 Pop $2 ; check space System::Int64Op $2 > $0 Pop $2 functionend section - StrCpy $0 12345 ; kb u need StrCpy $1 'c:' ; check drive c: for space Call CheckSpaceFunc IntCmp $2 1 okay MessageBox MB_OK "Error: Not enough disk space" okay: sectionend