ayuda con logica para el GetDiskFreeSpaceEx

Iniciado por _CrisiS_, 8 Septiembre 2010, 04:55 AM

0 Miembros y 1 Visitante están viendo este tema.

_CrisiS_


Hola amigos estoy usando la APi GetDiskFreeSpaceEx para calcular los espacios de los discos.
Bueno cuando recibo el tamaño de bytes de un label, comparando fisicamente con la particiion (ejm D:) es la misma , ahora mi problema creo q es en la logica, o en los tipo de dato q aplico para convertir esos datos En GB. (redondeados a 2 decimales), acontinuacion pondre el codigo (resumido de lo que uso)


'Api
Private Declare Function GetDiskFreeSpaceEx Lib "Kernel32" Alias "GetDiskFreeSpaceExA" (ByVal RootPathName As String, ByRef lpFreeBaytesAvailableToCaller As [b]Long,[/b] ByRef lpTotalNumberofBytes As [b]Long[/b], ByRef lpTotalNumberofFreeBytes As [b]Long[/b]) As Integer


Private Sub MostrarDatos()
        Dim Disco As String
        Dim Capacidad As Single
        Dim Libre As Long
        Dim PorcentajeUsado As Long
        Dim PorcentajeLibre As Long
        Dim retorno As Integer
...
retorno = GetDiskFreeSpaceEx(Disco, Libre, Capacidad, Libre)
        Capacidad = Capacidad / 10000
        Libre = Libre / 10000
        'MessageBox.Show(Libre)
        Capacidad = Capacidad * 10000 / 1000000
        Libre = Libre * 10000 / 1000000


        Label1.Text = String.Format(Capacidad, "0. 00") & "Megabytes"
        GB1_label.Text = Math.Round(Capacidad / 1024, 2) & " GB"

        Label2.Text = String.Format(Capacidad - Libre, "0.00") & " MegaBytes Usados"
        GB2_label.Text = Math.Round(Capacidad - Libre, 2)
        Label3.Text = String.Format(Libre, "0.00") & " MegaBytes Libres"

        PorcentajeLibre = Libre * 100 / Capacidad
        Label4.Text = String.Format(PorcentajeLibre, "0.00") & " % de Bytes Libres"

        PorcentajeUsado = (Capacidad - Libre) * 100 / Capacidad
        Label5.Text = String.Format(PorcentajeUsado, "0.00") & " % de Bytes Utilizados"


Bueno el problema que tengo es que las equivalencias que me salen son las "reales", como pueden apreciar en la siguiente imagen:

BlackZeroX

#1
Edito:

Solo por aclarar en currency al obtener los valores salen con coma decimal por ello hay que multiplicar por 10000 para eliminarla, aun que puede trabajarse aun con ella...

Edicion 2

en tu codigo falta dividir una vez mas entre 1024 para obtener los Gigas!¡, en espacio utilizado como en espacio libre

Código (Vb) [Seleccionar]


Option Explicit

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 Form_Load()
    Dim r As Long, BytesFreeToCalller As Currency, TotalBytes As Currency
    Dim TotalFreeBytes As Currency, TotalBytesUsed As Currency
    Const RootPathName$ = "c:\"
    Call GetDiskFreeSpaceEx(RootPathName, BytesFreeToCalller, TotalBytes, TotalFreeBytes)
    Me.AutoRedraw = True
    Me.Cls
    Me.Print "    Datos del Disco " & RootPathName
    Me.Print "Capasidad Total:"
    Me.Print ShowPrintForm(GetExpBytes(TotalBytes * 10000, 2))
    Me.Print
    Me.Print "Espacio Libre en " & RootPathName
    Me.Print ShowPrintForm(GetExpBytes(TotalFreeBytes * 10000, 2))
    Me.Print
    Me.Print "Bytes Disponibles en " & RootPathName
    Me.Print ShowPrintForm(GetExpBytes(BytesFreeToCalller * 10000, 2))
    Me.Print
    Me.Print "Espacio Utilizado en " & RootPathName
    Me.Print ShowPrintForm(GetExpBytes((TotalBytes - TotalFreeBytes) * 10000, 2))
End Sub

Private Function GetExpBytes(ByVal vVal As Currency, Optional Redondear As Long = -1) As Currency()
Dim TmpArr()    As Currency
Dim PtrArr&
   ReDim TmpArr(PtrArr&)
   TmpArr(PtrArr&) = vVal
   Do Until Val(TmpArr(PtrArr&) - 100) < 0
       PtrArr& = PtrArr& + 1
       ReDim Preserve TmpArr(PtrArr&)
       If Redondear < 0 Then
           TmpArr(PtrArr&) = TmpArr(PtrArr& - 1) / 1024
       Else
           TmpArr(PtrArr&) = Round(TmpArr(PtrArr& - 1) / 1024, Redondear)
       End If
   Loop
   GetExpBytes = TmpArr()
End Function

Private Function ShowPrintForm(ByRef RefCol() As Currency, Optional StrAbrev$ = "KMGT", Optional Sep$ = vbCrLf) As String
If (Not RefCol) = -1 Then Exit Function
Dim vByte(3) As Byte '  //  Index:QueCosa? --> 0:LBound();  1:Len();  2:Ubound():  3:IndexFor
   vByte(0) = LBound(RefCol) + 0
   ShowPrintForm = RefCol(vByte(0)) & " Bytes"
   vByte(1) = Len(StrAbrev$) + 0
   vByte(2) = UBound(RefCol) + 0
   If vByte(2) > vByte(1) Then vByte(2) = vByte(1)
   For vByte(3) = vByte(0) + 1 To vByte(2)
       ShowPrintForm = ShowPrintForm & Sep$ & RefCol(vByte(3)) & " " & Mid$(StrAbrev$, vByte(3), 1) & "Bytes"
   Next
End Function



Dulce Infierno Lunar!¡.
The Dark Shadow is my passion.

_CrisiS_

vaya ese code es en vb6 nop?  yo lo nesesito para vb net, aunque si me sirvio para ciertos puntos.

O si desean les subo mi proy para que no tengan q crearlo desde 0

_katze_

_Crisis_ te estaria agradecido porq no puedo todavia usar apis ni nada por el estilo que tenga  que ver con vb6 en vb.net !

_CrisiS_

Bueno ay te lo dejo:
http://www.4shared.com/file/kCNX-1bA/HDmedidor2.html

espero que puedas solucionar el problema logico q tiene mi proy. X)

P.D > No piratearlo please XD!!!!

BlackZeroX

#5
.
El codigo que te he dejado usa esactamente lo mismo que el tuyo, la API GetDiskFreeSpaceEx, asi que no te van a hacer ningun trabajo!¡.

P.D.: Esta sección es vb6 NO .NET asi que no creo que alguien te lo vaya a hacer ( almenos yo no lo hare, con el ejemplo que te deje arriba es suficiente al respecto de la API Dada, ademas no tengo instalado VS NET )

Edito:

Acabo de ver tu Source con el block de notas y estas programando como si fuese vb6, yo no usaria On Error Resume Next en .NEt  usaria el Try Catch, entre otras cosas propias de .NET

Dulces Lunas!¡.
The Dark Shadow is my passion.

_CrisiS_

a chispas no me abia percatado que NET estaba en un subforo, jejej grave problema mio sorry X_X, Pero bueno respondiendote tu ejemplo va bien en vb6 pero al migrarlo a net da varios errores los cuales no llego a corregir todos, y me estanco alli X)

BlackZeroX

.
indica los errores y te dire que onda!¡.

Posiblemente sean los Me.Print  susutituyelos por Debug.print (PAra mostrarlos en la venta Inmediato del IDE de .NET), seguramente sea eso!¡.

y si no es el unico marca cuales son!¡.

Dulces Lunas!¡.
The Dark Shadow is my passion.


_CrisiS_

Disculpen por la demora =P

aver katze aca ay otro link : http://www.4shared.com/file/p6KK0eTh/HDmedidor2.html

BlackZero:
mmm aver en:
AutoRedraw    // no e sun mienbro del proyecto
lo mismo con cls
GetExpBytes = TmpArr()  //el numero de indices es inferior al numero de dimensiones de la matriz indizada
Not RefCol // el operador 'Not' no esta definido para el tipo '1-matriz.dimecional de Decimal'.
son por el momento los errores q me dan tu code XP