Autor
|
Tema: ayuda con logica para el GetDiskFreeSpaceEx (Leído 6,948 veces)
|
_CrisiS_
Desconectado
Mensajes: 286
|
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:
|
|
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
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!¡.
|
|
« Última modificación: 8 Septiembre 2010, 17:33 pm por BlackZeroX »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
_CrisiS_
Desconectado
Mensajes: 286
|
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
|
|
|
En línea
|
|
|
|
_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 !
|
|
|
En línea
|
|
|
|
_CrisiS_
Desconectado
Mensajes: 286
|
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!!!!
|
|
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
. 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!¡.
|
|
« Última modificación: 9 Septiembre 2010, 06:54 am por BlackZeroX »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
_CrisiS_
Desconectado
Mensajes: 286
|
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)
|
|
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
. 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!¡.
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
_katze_
|
se callo el link man !
|
|
|
En línea
|
|
|
|
_CrisiS_
Desconectado
Mensajes: 286
|
Disculpen por la demora =P aver katze aca ay otro link : http://www.4shared.com/file/p6KK0eTh/HDmedidor2.htmlBlackZero: 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
|
|
|
En línea
|
|
|
|
|
|