Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: _CrisiS_ en 8 Septiembre 2010, 04:55 am



Título: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: _CrisiS_ en 8 Septiembre 2010, 04:55 am

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)

Código:
'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:
(http://i166.photobucket.com/albums/u108/Elcondecri/ERRORES/logic.jpg)


Título: Re: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: BlackZeroX en 8 Septiembre 2010, 07:49 am
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
  1.  
  2. Option Explicit
  3.  
  4. Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" _
  5.        (ByVal lpRootPathName As String, _
  6.         lpFreeBytesAvailableToCaller As Currency, _
  7.         lpTotalNumberOfBytes As Currency, _
  8.         lpTotalNumberOfFreeBytes As Currency) As Long
  9.  
  10. Private Sub Form_Load()
  11.    Dim r As Long, BytesFreeToCalller As Currency, TotalBytes As Currency
  12.    Dim TotalFreeBytes As Currency, TotalBytesUsed As Currency
  13.    Const RootPathName$ = "c:\"
  14.    Call GetDiskFreeSpaceEx(RootPathName, BytesFreeToCalller, TotalBytes, TotalFreeBytes)
  15.    Me.AutoRedraw = True
  16.    Me.Cls
  17.    Me.Print "    Datos del Disco " & RootPathName
  18.    Me.Print "Capasidad Total:"
  19.    Me.Print ShowPrintForm(GetExpBytes(TotalBytes * 10000, 2))
  20.    Me.Print
  21.    Me.Print "Espacio Libre en " & RootPathName
  22.    Me.Print ShowPrintForm(GetExpBytes(TotalFreeBytes * 10000, 2))
  23.    Me.Print
  24.    Me.Print "Bytes Disponibles en " & RootPathName
  25.    Me.Print ShowPrintForm(GetExpBytes(BytesFreeToCalller * 10000, 2))
  26.    Me.Print
  27.    Me.Print "Espacio Utilizado en " & RootPathName
  28.    Me.Print ShowPrintForm(GetExpBytes((TotalBytes - TotalFreeBytes) * 10000, 2))
  29. End Sub
  30.  
  31. Private Function GetExpBytes(ByVal vVal As Currency, Optional Redondear As Long = -1) As Currency()
  32. Dim TmpArr()    As Currency
  33. Dim PtrArr&
  34.    ReDim TmpArr(PtrArr&)
  35.    TmpArr(PtrArr&) = vVal
  36.    Do Until Val(TmpArr(PtrArr&) - 100) < 0
  37.        PtrArr& = PtrArr& + 1
  38.        ReDim Preserve TmpArr(PtrArr&)
  39.        If Redondear < 0 Then
  40.            TmpArr(PtrArr&) = TmpArr(PtrArr& - 1) / 1024
  41.        Else
  42.            TmpArr(PtrArr&) = Round(TmpArr(PtrArr& - 1) / 1024, Redondear)
  43.        End If
  44.    Loop
  45.    GetExpBytes = TmpArr()
  46. End Function
  47.  
  48. Private Function ShowPrintForm(ByRef RefCol() As Currency, Optional StrAbrev$ = "KMGT", Optional Sep$ = vbCrLf) As String
  49. If (Not RefCol) = -1 Then Exit Function
  50. Dim vByte(3) As Byte '  //  Index:QueCosa? --> 0:LBound();  1:Len();  2:Ubound():  3:IndexFor
  51.    vByte(0) = LBound(RefCol) + 0
  52.    ShowPrintForm = RefCol(vByte(0)) & " Bytes"
  53.    vByte(1) = Len(StrAbrev$) + 0
  54.    vByte(2) = UBound(RefCol) + 0
  55.    If vByte(2) > vByte(1) Then vByte(2) = vByte(1)
  56.    For vByte(3) = vByte(0) + 1 To vByte(2)
  57.        ShowPrintForm = ShowPrintForm & Sep$ & RefCol(vByte(3)) & " " & Mid$(StrAbrev$, vByte(3), 1) & "Bytes"
  58.    Next
  59. End Function
  60.  
  61.  

Dulce Infierno Lunar!¡.


Título: Re: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: _CrisiS_ en 9 Septiembre 2010, 04:29 am
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


Título: Re: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: _katze_ en 9 Septiembre 2010, 05:02 am
_Crisis_ te estaria agradecido porq no puedo todavia usar apis ni nada por el estilo que tenga  que ver con vb6 en vb.net !


Título: Re: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: _CrisiS_ en 9 Septiembre 2010, 05:51 am
Bueno ay te lo dejo:
Código:
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!!!!


Título: Re: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: BlackZeroX en 9 Septiembre 2010, 06:49 am
.
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!¡.


Título: Re: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: _CrisiS_ en 9 Septiembre 2010, 06:55 am
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)


Título: Re: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: BlackZeroX en 9 Septiembre 2010, 07:03 am
.
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!¡.


Título: Re: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: _katze_ en 9 Septiembre 2010, 18:10 pm
se callo el link man !


Título: Re: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: _CrisiS_ en 11 Septiembre 2010, 16:56 pm
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


Título: Re: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: _CrisiS_ en 13 Septiembre 2010, 00:21 am
Ehhhh alfin despues de tanto sufrir me logro salir =P.
En agradecimientos a todos los que me ayudaron y me aguantaron XD, comparto el proyecto por si alguien mas lo nesesita =D.

http://www.4shared.com/file/uCzZk2pD/HDmedidor.html (http://www.4shared.com/file/uCzZk2pD/HDmedidor.html)


Título: Re: ayuda con logica para el GetDiskFreeSpaceEx
Publicado por: cobein en 13 Septiembre 2010, 03:23 am
http://foro.elhacker.net/empty-t214383.0.html;msg1017277#msg1017277