Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => 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)


'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 (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!¡.
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:
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