FREE-SPACE и большой диск

Обсуждение программ nnCron и nnCron LITE

FREE-SPACE и большой диск

Postby Morituruz » Mon, 13 May 2013, 10:23

Как я понимаю, FREE-SPACE считает свободное место в 32-битном виде, соответственно, когда на диске больше чем 2147 Гб, то оно выдаёт непотребное отрицательное число. Можно ли решить эту проблему?
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: FREE-SPACE и большой диск

Postby VoidVolker » Mon, 13 May 2013, 11:42

Code: Select all
\ lpFreeBytesAvailable [out, optional]
  \ A pointer to a variable that receives the total number of free bytes on a disk that are available to the user who is associated with the calling thread.

\ lpTotalNumberOfBytes [out, optional]
  \ A pointer to a variable that receives the total number of bytes on a disk that are available to the user who is associated with the calling thread.

\ lpTotalNumberOfFreeBytes [out, optional]
  \ A pointer to a variable that receives the total number of free bytes on a disk.

USER-CREATE lpFreeBytesAvailable 2 CELLS USER-ALLOT
USER-CREATE lpTotalNumberOfBytes 2 CELLS USER-ALLOT
USER-CREATE lpTotalNumberOfFreeBytes 2 CELLS USER-ALLOT

: DiskUserFreeSpace lpFreeBytesAvailable 2@ ;
: DiskTotalSpace lpTotalNumberOfBytes 2@ ;
: DiskFreeSpace lpTotalNumberOfFreeBytes 2@ ;

: GetFreeSpace   \ ( az -- d(x x) ) \ Получить объем свободного места в каталоге в байтах, возвращает число двойной длины
  >R lpFreeBytesAvailable lpTotalNumberOfBytes lpTotalNumberOfFreeBytes R> GetDiskFreeSpaceExA DROP
  \ Возвращает размеры в формате ULARGE_INTEGER:
  \ typedef union _ULARGE_INTEGER {
    \ struct {
      \ DWORD LowPart;
      \ DWORD HighPart;
    \ };
    \ struct {
      \ DWORD LowPart;
      \ DWORD HighPart;
    \ } u;
    \ ULONGLONG QuadPart;
  \ } ULARGE_INTEGER, *PULARGE_INTEGER;
  \ Меняем пордядок байтов:
  lpFreeBytesAvailable 2@ SWAP lpFreeBytesAvailable 2!
  lpTotalNumberOfBytes 2@ SWAP lpTotalNumberOfBytes 2!
  lpTotalNumberOfFreeBytes 2@ SWAP lpTotalNumberOfFreeBytes 2!
 
  lpTotalNumberOfFreeBytes 2@
;

: GetFreeSpaceMb   \ ( az -- n ) \ Получить объем свободного места в каталоге в мегабайтах
  GetFreeSpace 0x100000 UM/MOD NIP 
;

: GetFreeSpaceGb   \ ( az -- n ) \ Получить объем свободного места в каталоге в гигабайтах
  GetFreeSpace 0x40000000 UM/MOD NIP 
;

: DiskGetFreeSpace   \ ( char -- d(x x) ) \ Получить объем свободного места в каталоге в байтах, возвращает число двойной длины
  0x005C3A00   \ Строка :\
  OR SP@ GetFreeSpace ROT DROP
;

: DiskGetFreeSpaceMb   \ ( char -- n ) \ Получить объем свободного места в каталоге в мегабайтах
  0x005C3A00
  OR SP@ GetFreeSpaceMb NIP
;

: DiskGetFreeSpaceGb   \ ( char -- n ) \ Получить объем свободного места в каталоге в гигабайтах
  0x005C3A00
  OR SP@ GetFreeSpaceGb NIP
;

: DiskGetFreeSpace:   \ ( " char" -> d(x x) ) \ Получить объем свободного места в каталоге в байтах, возвращает число двойной длины
  BL PARSE DROP C@
  STATE @ IF
    [COMPILE] LITERAL
    POSTPONE DiskGetFreeSpace
  ELSE
    DiskGetFreeSpace
  THEN
; IMMEDIATE

: DiskGetFreeSpaceMb:   \ ( " char" -> n ) \ Получить объем свободного места в каталоге в мегабайтах
  BL PARSE DROP C@
  STATE @ IF
    [COMPILE] LITERAL
    POSTPONE DiskGetFreeSpaceMb
  ELSE
    DiskGetFreeSpaceMb
  THEN
; IMMEDIATE

: DiskGetFreeSpaceGb:   \ ( " char" -> n ) \ Получить объем свободного места в каталоге в гигабайтах
  BL PARSE DROP C@
  STATE @ IF
    [COMPILE] LITERAL
    POSTPONE DiskGetFreeSpaceGb
  ELSE
    DiskGetFreeSpaceGb
  THEN
; IMMEDIATE


Code: Select all
Z" E:\" GetFreeSpace DOUBLE>S TYPE CR

Code: Select all
Z" E:\" GetFreeSpaceMb . CR

Code: Select all
Z" E:\" GetFreeSpaceGb . CR

Code: Select all
CHAR E DiskGetFreeSpaceGb . CR

Code: Select all
DiskGetFreeSpaceGb: E . CR
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: FREE-SPACE и большой диск

Postby Morituruz » Mon, 13 May 2013, 13:02

Спасибо!
Есть какой-то смысл в том, что диск указывается как папка («E:\» вместо «E»)? Может, можно просто буквой?
Зачем в слове GetFreeSpace столько закомментированного текста?
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: FREE-SPACE и большой диск

Postby VoidVolker » Mon, 13 May 2013, 14:38

Moriturus wrote:сть какой-то смысл в том, что диск указывается как папка («E:\» вместо «E»)?

Допускается указание каталогов, в т.ч. и сетевых дисков, при этом результат будет для диска.
Moriturus wrote:Зачем в слове GetFreeSpace столько закомментированного текста?

Это не текст, а исходник с МСДН с описанием формата возвращаемых данных и объясняющий смысл обмена байтов местами.
Добавил слова для дисков.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests