J'ai écrit une fonction appelée CheckFreeSpace
dans NSIS pour ce faire. Malheureusement, il a les limitations suivantes:
- Pour calculer la taille de toutes les sections de votre installation, vous devez modifier
CheckFreeSpace
pour ajouter chaque section, en connaissant chaque variable qui a été écrit chaque identifiant de section dans. Je ne peux pas trouver un moyen d'itérer sur toutes les sections qui seront installées en utilisant NSIS.
- Le lecteur d'installation doit être calculé car
${DriveSpace}
requiert une lettre de lecteur, pas un chemin d'accès à un répertoire arbitraire. La chaîne de lettre de lecteur est calculée avec StrCpy $instdrive $INSTDIR 3
. Si la variable $INSTDIR
est un chemin relatif ou ne commence pas par une chaîne telle que C:\
, cela échouera. Si l'installation ne peut pas continuer, elle produit un MessageBox
. Vous pouvez supprimer le MessageBox
en ajoutant /SD IDOK
à la fin de l'instruction, mais l'utilisateur n'est pas informé de l'échec de l'installation: je ne trouve pas de moyen d'émettre à stdout
à partir de NSIS. Peut-être que le code de retour de l'installateur est suffisant?
- Si l'espace libre du disque est vraiment faible (comme 10kb), le programme d'installation ne fonctionnera pas du tout; il n'a pas d'espace pour décompresser ses DLL temporaires dans le répertoire
\tmp
.
En outre, dans ma mise en œuvre ci-dessous, CheckFreeSpace
a une valeur codée en dur pour l'espace libre après l'installation. Évidemment, cela peut être paramétré.
Ici, il est dans un installateur exemple:
!include FileFunc.nsh
!insertmacro DriveSpace
Name "CheckFreeSpace"
OutFile "C:\CheckFreeSpace.exe"
InstallDir C:\tmp\checkfreespace
Page instfiles
Section "install_section" install_section_id
Call CheckFreeSpace
CreateDirectory $INSTDIR
SetOutPath $INSTDIR
File "C:\installme.bat"
WriteUninstaller "$INSTDIR\Uninstall.exe"
DetailPrint "Installation Successful."
SectionEnd
Section "Uninstall"
RMDIR /r "$INSTDIR"
SectionEnd
Function CheckFreeSpace
var /GLOBAL installsize
var /GLOBAL adjustedinstallsize
var /GLOBAL freespace
var /GLOBAL instdrive
; Verify that we have sufficient space for the install
; SectionGetSize returns the size of each section in kilobyte.
SectionGetSize ${install_section_id} $installsize
; Adjust the required install size by 10mb, as a minimum amount
; of free space left after installation.
IntOp $adjustedinstallsize $installsize + 10240
; Compute the drive that is the installation target; the
; ${DriveSpace} macro will not accept a path, it must be a drive.
StrCpy $instdrive $INSTDIR 3
; Compute drive space free in kilobyte
${DriveSpace} $instdrive "/D=F /S=K" $freespace
DetailPrint "Determined installer needs $adjustedinstallsize kb ($installsize kb) while $freespace kb is free"
IntCmp $adjustedinstallsize $freespace spaceok spaceok
MessageBox MB_OK|MB_ICONSTOP "Insufficient space for installation. Please free space for installation directory $INSTDIR and try again."
DetailPrint "Insufficient space for installation. Installer needs $adjustedinstallsize kb, but freespace is only $freespace kb."
Abort "Insufficient space for installation."
spaceok:
DetailPrint "Installation target space is sufficient"
FunctionEnd
Merci @Anders, je vais essayer cela. Je n'écris jamais rien pour Win95, mais mieux vaut être préparé ... –