Как проверить пространство на диске, взяв путь из папки назначения При установке программного обеспечения с помощью NSIS - PullRequest
0 голосов
/ 19 января 2019

Как проверить пространство на диске, выбрав путь из папки назначения При установке программного обеспечения.

Я могу проверить пространство на определенном диске (например, «C»), используяфрагмент кода ниже.

Но я хочу динамически извлечь диск или путь из папки назначения и проверить, достаточно ли места на диске или нет.

!define sysGetDiskFreeSpaceEx 'kernel32::GetDiskFreeSpaceExA(t, *l, *l, *l) i'    
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 "TestApp"

      SectionIn RO


      StrCpy $0 40000 ; 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

Может кто-нибудь, пожалуйста, помогите мне

1 Ответ

0 голосов
/ 19 января 2019

Встроенная страница каталога (Page Directory или !insertmacro MUI_PAGE_DIRECTORY) выполнит проверку свободного места и позаботится обо всех деталях.

Может быть заманчиво просто сделать StrCpy $1 $InstDir 3, чтобы получить букву диска и выполнить проверку самостоятельно, но это может дать неправильный результат, потому что NTFS поддерживает монтирование других томов в папку .

GetDiskFreeSpaceEx поддерживает пути к каталогам, но я считаю, что путь должен существовать, поэтому, если вы хотите использовать $ InstDir до того, как был создан $ InstDir, вы должны отключить подпапки, пока GetDiskFreeSpaceEx не будет успешным (или у вас будет только недопустимый буква диска слева от пути).

Ваш !define также должен быть изменен с GetDiskFreeSpaceExA на GetDiskFreeSpaceEx, поскольку он использует строковый тип t. Это сделает его Unicode-совместимым.

...