Newsgroup: it.comp.lang.visual-basic
Titolo: -> calcolare lo spazio libero su HD

Da: lele <le...@no.spam>
Oggetto: -> calcolare lo spazio libero su HD
Data: sabato 22 gennaio 2000 15.28
Come posso calcolare lo spazio libero su HD.
Ho trovato questa funzione:
Public Declare Function GetDiskFreeSpace Lib "kernel32" Alias
"GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As
Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long,
lpTotalNumberOfClusters As Long) As Long
Ma non so come impostare i parametri
--
RISPONDETEMI SUL NEWSGROUP

 Public Declare Function GetDiskFreeSpace Lib "kernel32" Alias
La faccenda non è così semplice. Questa API si può utilizzare solo fino a
Win95 OSR2 escluso, poi bisogna usare GetDiskFreeSpaceEx, altrimenti si
ottengono risultato sbagliati per gli HD di dimensioni maggiore di 2Gb e
Microsoft dice che i risultati potrebbero essere errati anche per dimensioni
inferiori.
Però GetDiskFreeSpaceEx restituisce un valore di tipo ULARGE_INTEGER, cioè a
64bit che non ho ancora capito come maneggiare (forse si può provare con un
Currency?).
Quindi bisognerebbe nell'ordine:
Chiamare la LoadLibraryEx per caricare la KERNEL32.DLL, chiamare la
GetProcAddress per richiedere l'indirizzo di  GetDiskFreeSpaceEx , se la
chiamata ritorna ERROR_CALL_NOT_IMPLEMENTED, usare la GetDiskFreeSpace,
altrimenti usare la GetDiskFreeSpaceEx.
Spero ci sia qualcuno che l'abbia già fatto e voglia postarla...
Ciao
*Roby*

 Win95 OSR2 escluso, poi bisogna usare GetDiskFreeSpaceEx
credo valga anche il reciproco. a usare la get-ex con w95/1 temo ci si
becchi un errore. prob va controllata la versione --> usata la fx giusta.
cmq non ho provato.


 Come posso calcolare lo spazio libero su HD.
Un francese di origine Piemontese:  
jeanpau...@worldonline.fr
  dice
Prova questo codice che funziona bene con Windows 98
Deve mettere :
1 command
1 Drive.Box che permette di scegliere il Drive A:\    C:\    D:\    ......
<-------------------------
Dim C As String
Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias
"GetDiskFreeSpaceExA" (ByVal lpRootPathName As String,
lpFreeBytesAvailableToCaller As Currency, lpTotalNumberOfBytes As Currency,
lpTotalNumberOfFreeBytes As Currency) As Long
Private Sub Command1_Click()
Cls
Dim r As Long, BytesFreeToCalller As Currency, TotalBytes As Currency
    Dim TotalFreeBytes As Currency, TotalBytesUsed As Currency
      Call GetDiskFreeSpaceEx(C, BytesFreeToCalller, TotalBytes,
TotalFreeBytes)
    Print
 Print "   Capacita del Drive: ", Format$(TotalBytes * 10000,
"###,###,###,##0") & " bytes"
   Print "   Piazza libera:      ", Format$(TotalFreeBytes * 10000,
"###,###,###,##0") & " bytes"
  Print "   Spazzio utilizato: ", Format$((TotalBytes - TotalFreeBytes) *
10000, "###,###,###,##0") & " bytes"
End Sub
Public Sub Drive1_Change()
C = Left(Drive1.Drive, 2) + "\"  'Trovare il Path del Drive
End Sub

 cmq non ho provato.
E' esattamente quello che dicevo poco dopo nel mio post. Rieccolo qui:
"Quindi bisognerebbe nell'ordine:
 Chiamare la LoadLibraryEx per caricare la KERNEL32.DLL, chiamare la
GetProcAddress per richiedere l'indirizzo di  GetDiskFreeSpaceEx , se la
chiamata ritorna ERROR_CALL_NOT_IMPLEMENTED, usare la GetDiskFreeSpace,
altrimenti usare la GetDiskFreeSpaceEx."
ERROR_CALL_NOT_IMPLEMENTED viene ritornato dalla GetProcAddress se stai in
Win95/1, altrimenti ti ritorna l'indirizzo della funzione
GetDiskFreeSpaceEx, quindi la puoi chiamare liberamente.
Questo metodo funziona anche se sei in NT4 o NT3.5. Nel primo caso puoi
usare la GetDiskFreeSpaceEx, nel secondo la GetDiskFreeSpace.
Ciao
*Roby*

 E' esattamente quello che dicevo poco dopo nel mio post.
scusa, dormivo.
cfr orario del mio, di post...
ciao, a.

 
Io utilizzo questo codice, non č mio, ma non mi ricordo dove lěho preso,
cmq funziona:
#If Win32 Then
 
    Private Type LARGE_INTEGER
        LowPart As Long
        HighPart As Long
    End Type
    Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias
"GetDiskFreeSpaceExA" _
                            (ByVal lpRootPathName As String, _
                             lpFreeBytesAvailableToCaller As
LARGE_INTEGER, _
                             lpTotalNumberOfBytes As LARGE_INTEGER, _
                             lpTotalNumberOfFreeBytes As Any) As Long
 
#End If 'WIN32 Types
Private Const MAX_USIGNEDLONG = 4294967295#     'Valore massimo dei long
senza segno
Private Function LargeIntegerToDouble(litLarInt As LARGE_INTEGER) As
Double
'***********************************************************************
'Trasformo un LARGE_INTEGER in un double
 
    LargeIntegerToDouble = SignedLongToUnsigned(litLarInt.LowPart) + _
                           (SignedLongToUnsigned(litLarInt.HighPart) *
MAX_USIGNEDLONG)
End Function
Private Function SignedLongToUnsigned(sltLngVal As Long) As Double
'*****************************************************************
'Converto un long con segno in senza segno
    If (sltLngVal < 0) Then
        SignedLongToUnsigned = sltLngVal + MAX_USIGNEDLONG + 1
    Else
        SignedLongToUnsigned = sltLngVal
    End If
End Function
Public Function DiskFreeSpace(dfsRootPathName As String, dfsFreeBytes As
Double, dfsTotalBytes As Double) As Boolean
'*************************************************************************************************
'Ricavo la dimensione del disco. Spazio libero e spazio totale.
'Risultati in byte
Dim dfsResult As Byte
Dim dfsLarIntFreeBytes As LARGE_INTEGER
Dim dfsLarIntTotalBytes As LARGE_INTEGER
    On Local Error Resume Next
    dfsResult = 0
    dfsResult = GetDiskFreeSpaceEx(dfsRootPathName, dfsLarIntFreeBytes,
dfsLarIntTotalBytes, ByVal 0&)
 
    If (dfsResult <> 0) And (Err.Number = 0) Then      'Rilevamento
coretto
        dfsFreeBytes = LargeIntegerToDouble(dfsLarIntFreeBytes)       
'Spazio libero
        dfsTotalBytes = LargeIntegerToDouble(dfsLarIntTotalBytes)     
'Spazio totale
        DiskFreeSpace = True
    Else
        DiskFreeSpace = False
    	(qui si potrebbe utilizare GetDiskFreeSpace nel caso ci si trovi in
un so senza 	GetDiskFreeSpaceEx)
    End If
End Function
Ciao 
:-) Hd (-:

 cmq funziona:
Bello il trucco del Type LARGE_INTEGER, immagino che venga dai tempi del VB4
a giudicare dalla condizione #If Win32.
Comunque nel frattempo mi sono informato e pare che in VB6 si possa usare il
tipo currency per semplificare la dichiarazione (in fondo č a 64 bit anche
lui), basta ricordarsi di shiftare i 4 caratteri di virgola verso sinistra
alla fine..
A questo punto si puň usare lo scheletro della tua funzione, che permette
furbamente di intercettare l'errore invece di dover chiamare 2 API per
vedere se la GetDiskFreeSpaceEx č implementata, ed il trucco č fatto.
Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias
"GetDiskFreeSpaceExA" (ByVal lpRootPathName As String,
lpFreeBytesAvailableToCaller As Currency, lpTotalNumberOfBytes As Currency,
lpTotalNumberOfFreeBytes As Currency) As Long
Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias
"GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As
Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long,
lpTtoalNumberOfClusters As Long) As Long
 Public Function SpazioLiberoSulDisco(ByVal drive As String, Optional ByRef
DimensioneTotale) As Currency
'***************************************************************************
**********************
' Funzione che permette di verificare lo spazio libero su disco
'
' Parametri:
'   drive   (stringa)   =   unita' periferica da esaminare, passata nel
formato "C:"
'                           se č NULL, l'operazione viene effettuata sul
drive corrente
'   DimensioneTotale    = Se viene passato ritorna la dimensione in byte
totale del disco
'
' Valori di ritorno:
'   ritorna il valore dello spazio libero su quell'unita', espresso in byte
'
'***************************************************************************
**********************
Dim lpSectorPerCluster As Long
Dim lpBytePerSector As Long
Dim lpNumberOfFreeClusters As Long
Dim lpTotalNumberOfClusters  As Long
Dim cBytesFreeToCaller As Currency
Dim cCapacitaDisco As Currency
    'Mi assicuro che la stringa termini con un '\'
    drive = Iif(Right$(" " & drive,1)<>"\",drive & "\",drive)
    On Local Error Resume Next
    Call GetDiskFreeSpaceEx(drive, cBytesFreeToCaller, cCapacitaDisco,
SpazioLiberoSulDisco)
    If Err = 0 Then
        On local error goto 0
        ' Shifto la parte in virgola del Currency
        DimensioneTotale = cCapacitaDisco * 10000
        SpazioLiberoSulDisco = SpazioLiberoSulDisco * 10000
    Else
        On local error goto 0
        Call GetDiskFreeSpace(drive, lpSectorPerCluster, lpBytePerSector,
lpNumberOfFreeClusters, lpTotalNumberOfClusters)
        DimensioneTotale = lpTotalNumberOfClusters * lpSectorPerCluster *
lpBytePerSector
        SpazioLiberoSulDisco = lpNumberOfFreeClusters * lpSectorPerCluster *
lpBytePerSector
    End If
End Function
Qualcuno puň provarla su NT3.51 o su Win95 SR1 per vedere se funziona anche
la chiamata a GetDiskFreeSpace?
Qualcuno ha capito che valore č  cBytesFreeToCaller e a cosa serve?
Ciao
*Roby*

Come la fate complicata!
Perchè usare le API quando ci sono funzioni già fatte?
Private Sub Command1_Click()
    Set Sys = CreateObject("Scripting.FileSystemObject")
    Set Drives = Sys.Drives
    Set unità = Drives("C:")
    Text1.Text = Unità.AvailableSpace
End Sub
Il risultato è in Byte effettivi, per trovarlo in kb, basta fare:
Val(Text1) mod 1024
Ciao gentaglia!
Iac - The VB Master
------------------------------
E-Mail: 
iac...@novamedia.it
ICQ UIN: 7622157
------------------------------

 Val(Text1) mod 1024
Ho sbagliato, non č
Val(Text1) mod 1024
ma
Val(Text1) / 1024
Ciao ciao




 Ciao gentaglia!
ciao, cognonimo !
--
andrea dot palazzi at tin dot it
free vb/sw: 
http://www.comune.modena.it/cittadini/apal/html/

cmq xche' mi da un numero di byte superiore,a quello effettivamente
disponibile?


RISPONDETEMI SUL NEWSGROUP



Rispondetemi sul NewsGroup