| 
	
		|  Autor | Tema: ayuda con logica para el GetDiskFreeSpaceEx  (Leído 7,387 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) 'ApiPrivate 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 CurrencyDim 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 StringIf (Not RefCol) = -1 Then Exit FunctionDim 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"    NextEnd 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.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 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  |  |  
 
	
 
   |