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)
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
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!¡.
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
_Crisis_ te estaria agradecido porq no puedo todavia usar apis ni nada por el estilo que tenga que ver con vb6 en vb.net !
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!!!!
.
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!¡.
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)
.
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!¡.
se callo el link man !
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
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)
http://foro.elhacker.net/empty-t214383.0.html;msg1017277#msg1017277