Kbase P129161: How to compute free space available in a disk or volume via 4gl using windows DLL?
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  2/22/2008 |
|
Status: Unverified
GOAL:
How to compute free space available in a disk or volume via 4gl using windows DLL?
FACT(s) (Environment):
Progress 9.x
OpenEdge 10.x
Windows
OpenEdge Category: Language (4GL/ABL)
FIX:
DEFINE VARIABLE vc_unidad AS CHARACTER NO-UNDO.
DEFINE VARIABLE lpsz_uni AS MEMPTR NO-UNDO.
DEFINE VARIABLE lpSectorsPerCluster AS MEMPTR NO-UNDO.
DEFINE VARIABLE lpBytesPerSector AS MEMPTR NO-UNDO.
DEFINE VARIABLE lpNumberOfFreeClusters AS MEMPTR NO-UNDO.
DEFINE VARIABLE lpTotalNumberOfClusters AS MEMPTR NO-UNDO.
DEFINE VARIABLE vl_ret AS INT NO-UNDO.
DEFINE VARIABLE vc_var AS CHARACTER NO-UNDO.
DEFINE VARIABLE vi_tot AS INTEGER NO-UNDO EXTENT 8.
DEFINE VARIABLE vd_bytespercluster AS DECIMAL NO-UNDO.
DEFINE VARIABLE vd_totalbytesfree AS DECIMAL NO-UNDO.
PROCEDURE GetDiskFreeSpaceA EXTERNAL "Kernel32.dll":
DEFINE INPUT PARAMETER lpszvolume AS LONG.
DEFINE OUTPUT PARAMETER lpSectorsPerCluster AS MEMPTR.
DEFINE OUTPUT PARAMETER lpBytesPerSector AS MEMPTR.
DEFINE OUTPUT PARAMETER lpNumberOfFreeClusters AS MEMPTR.
DEFINE OUTPUT PARAMETER lpTotalNumberOfClusters AS MEMPTR.
DEFINE RETURN PARAMETER lRetCode AS LONG.
END.
vc_unidad = "c:\".
ASSIGN SET-SIZE(lpsz_uni) = LENGTH(vc_unidad) + 3
PUT-STRING(lpsz_uni,1) = vc_unidad
PUT-BYTE(lpsz_uni, LENGTH(vc_unidad) + 1) = 0
PUT-BYTE(lpsz_uni, LENGTH(vc_unidad) + 1) = 0
SET-SIZE(lpSectorsPerCluster) = 4
SET-SIZE(lpBytesPerSector) = 4
SET-SIZE(lpNumberOfFreeClusters) = 4
SET-SIZE(lpTotalNumberOfClusters) = 4.
RUN GetDiskFreeSpaceA ( INPUT GET-POINTER-VALUE(lpsz_uni),
OUTPUT lpSectorsPerCluster,
OUTPUT lpBytesPerSector,
OUTPUT lpNumberOfFreeClusters,
OUTPUT lpTotalNumberOfClusters,
OUTPUT vl_ret).
vi_tot[1] = GET-LONG(lpSectorsPerCluster,1).
vi_tot[2] = GET-LONG(lpBytesPerSector,1).
vi_tot[3] = GET-LONG(lpNumberOfFreeClusters,1).
vi_tot[4] .= GET-LONG(lpTotalNumberOfClusters,1).
MESSAGE vl_ret
SKIP GET-STRING(lpsz_uni,1)
SKIP "SectorsPerCluster: " vi_tot[1]
SKIP "BytesPerSector: " vi_tot[2]
SKIP "NumberOfFreeClusters: " vi_tot[3]
SKIP "TotalNumberOfClusters: " vi_tot[4]
VIEW-AS ALERT-BOX INFO BUTTONS OK.
/* SectorsPerCluster * BytesPerSector will give you how many bytes are available per sector */
vd_bytespercluster = vi_tot[1] * vi_tot[2].
/*And by multiplying the result with NumberOfFreeClusters gives you the free space in bytes.*/
vd_totalbytesfree = vd_bytespercluster * vi_tot[3].
MESSAGE "Total Free Space in bytes: " vd_totalbytesfree SKIP
"Total Free Space in kilo bytes: " (vd_totalbytesfree / 1024) SKIP
"Total Free Space in mega bytes: " (vd_totalbytesfree / 1048576) SKIP
"Total Free Space in giga bytes: " (vd_totalbytesfree / 1073741824) SKIP
VIEW-AS ALERT-BOX INFO BUTTONS OK.
/* Eliminar espacio de memoria */
ASSIGN SET-SIZE(lpsz_uni) = 0
SET-SIZE(lpSectorsPerCluster) = 0
SET-SIZE(lpBytesPerSector) = 0
SET-SIZE(lpNumberOfFreeClusters) = 0
SET-SIZE(lpTotalNumberOfClusters) = 0.
.