Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Calcolo spazio libero che eccede i 2 Gb

Per calcolare lo spazio libero su un'unita usavo l'oggetto filesystem con le
istruzioni:
Set fs = CreateObject( _
        "Scripting.FileSystemObject")
Set Unita = fs.GetDrive(MexUnita)
(in fondo al messaggio c'e' la funzione completa)
Ho notato pero' che questo sistema ha dei problemi sotto windows98, in
quanto se un'unita' ha piu' di 2gb liberi restituisce solo 2Gb come spazio
libero anche se magari lo spazio e' di 30 gb.
So che 2Gb sono il limite del vecchio file system ma mi chiedo se non ci sia
comunque un modo per conoscere tutto lo spazio libero.
In fondo esplora risorse mi da lo spazio libero corretto anche sotto
windows98 per cui un metodo deve esistere.
Ho anche provato ad usare l'api GetDiskFreeSpace() ma ottengo gli stessi
risultati, anzi in questo caso anche su winXp e winMe c'e' sempre il limite
dei due Gb. :-/
Di norma sapere che c'erano 2Gb liberi era sufficiente per quasi tutte le
operazioni ma ora trovandomi a dover masterizzare Dvd, l'immagine iso
intermedia arriva a poco meno di 5Gb per cui e' un vero problema non
conoscere l'effettivo spazio libero sull'unita'.
Qualcuno conosce un metodo alternativo a quelli descritti per sapere lo
spazio libero?
ciao
Paolo B.
-------------
'Funzione per trovare info su un drive
Public Enum Tipo_GenereUnita
    tu_Sconosciuta = 0
    tu_Removibile = 1
    tu_Fissa = 2
    tu_Rete = 3
    tu_CD_ROM = 4
    tu_Disco_Ram = 5
End Enum
Public Type Tipo_Drive
    Lettera As String * 1
    Tipo As Tipo_GenereUnita
    Pronta As Boolean
    Seriale As Long
    Nome As String * 64
    SpazioTotale As Double
    SpazioLibero As Double
    NomeCondiviso As String
End Type
Public Function TrovaInfoUnita(Lettera As String, _
    ByRef InfoData As Tipo_Drive) As Boolean
'riempie struttura InfoData con informazioni
'su unita corrispondente a Lettera
'se unita non presente restituisce false
Dim fs, Unita
Dim SoloLettera As String
Dim MexUnita As String
MexUnita = Left(Lettera, 1) & ":\"
On Error Resume Next
Err.Clear
Set fs = CreateObject( _
        "Scripting.FileSystemObject")
Set Unita = fs.GetDrive(MexUnita)
If (Err.Number = 68) Then
    With InfoData
        .Lettera = ""
        .Nome = ""
        .Pronta = False
        .Seriale = 0
        .SpazioLibero = 0
        .SpazioTotale = 0
        .Tipo = 0
        .NomeCondiviso = ""
    End With
    TrovaInfoUnita = False
    Exit Function
End If
With InfoData
    .Lettera = Unita.driveletter
    .Pronta = Unita.isready
    .NomeCondiviso = Unita.ShareName
    If (.Pronta = True) Then
        .Nome = Unita.volumename
        .Seriale = Unita.serialnumber
        .SpazioLibero = Unita.freespace
        .SpazioTotale = Unita.TotalSize
    Else
        .Nome = ""
        .Seriale = 0
        .SpazioLibero = 0
        .SpazioTotale = 0
    End If
    .Tipo = Unita.drivetype
End With
If (Trim(InfoData.Lettera) = "") Then
    TrovaInfoUnita = False
Else
    TrovaInfoUnita = True
End If
End Function

 
Infatti come dice MSDN, dato che la GetDiskFreeSpace() non da 
informazioni per dischi sopra i 2Gb, devi usare la GetDiskFreeSpaceEx(), 
passando come parametri dei Currency anzichč dei long, dato che i 
Currency sono a tutti gli effetti degli interi a 64bit a cui viene 
piantato il separatore decimale in mezzo.
Ciao

 ha scritto nel messaggio
news:bkcbsb$3bc$1...@ID-184808.news.uni-berlin.de...

Grazie per l'info.
In effetti non avevo trovato nel winapi32.txt la declare della funzione ex,
c'era solo la GetDiskFreeSpace()
L'unica differenza nella declare (ex) e' che i parametri sono currency
invece che long?
Anche il valore restituito e' un currency?
Ho cercato nella mia msdn (piuttosto vecchiotta) e non ho trovato nessuna
declare di questa funzione.
ciao
Paolo B.

 nessuna declare di questa funzione.
Perchè non esisteva fino a Windows 95 OSR2. Prova con la MSDN online.
http://msdn.microsoft.com/
Ciao
*Roby*