TAMANHO DE UNIDADE -OU DIRETORIO- DE REDE

MARLON 31/08/2009 15:50:45
#321482
Olá, boa tarde.

Alguém sabe como posso pegar informações como [Ô]tamanho[Ô] e [Ô]espaço livre[Ô] das unidades mapeadas?

Essas informações ficam disponíveis quando colocamos a exibição em [Ô]detalhes[Ô], no windows explorer. Então aparecem todas as unidades e o resumo das informações.

Encontrei este exemplo na net:

Dim objFSO As Object
Dim objFolder As Object
Dim i As Long

Set objFSO = CreateObject([Ô]Scripting.FileSystemObject[Ô])
Set objFolder = objFSO.GetFolder([Ô]C:\Program Files[Ô])
i = objFolder.Size

Set objFolder = Nothing
Set objFSO = Nothing


Este não serve pois o windows faz uma verificação arquivo por arquivo (botão direito, propriedades). E no meu caso, preciso verificar o tamanho de uma unidade que tem mais ou menos 80GB de arquivos cujos tamanhos são em média 14KB. Já imaginaram o tempo pra calcular isso? Pois é, ainda mais isso em rede.
Fazendo essa verificação [Ô]manualmente[Ô] (verificando as propriedades da unidade), leva algumas horas. No entanto preciso dessa informação na hora. Como acontece na exibição em detalhes das unidades. Lá a informação é processada muito rápido, talvez por não ser uma medição tão precisa, mas é o que eu preciso.

Alguém tem uma dica?
ASHKATCHUP 31/08/2009 16:03:37
#321486
Resposta escolhida
Crie um form com:
-1 Textbox
-3 Labels
-1 Command Button


E assista a mágica acontecer.



Option Explicit

Private Type LARGE_INTEGER
lowpart As Long
highpart As Long
End Type

Private Declare Function GetDiskFreeSpaceEx Lib [Ô]kernel32[Ô] Alias [Ô]GetDiskFreeSpaceExA[Ô] (ByVal lpRootPathName As String, lpFreeBytesAvailableToCaller As LARGE_INTEGER, lpTotalNumberOfBytes As LARGE_INTEGER, lpTotalNumberOfFreeBytes As LARGE_INTEGER) As Long

Sub GetDiskSpace(sDrive As String)
Dim lresult As Long
Dim liAvailable As LARGE_INTEGER
Dim liTotal As LARGE_INTEGER
Dim liFree As LARGE_INTEGER
Dim dblAvailable As Double
Dim dblTotal As Double
Dim dblFree As Double
Dim lresultused As Double
[ô]
If Right(sDrive, 1) <> [Ô][Ô] Then sDrive = sDrive & [Ô][Ô]
[ô]Determine the Available Space, Total Size and Free Space of a drive
lresult = GetDiskFreeSpaceEx(sDrive, liAvailable, liTotal, liFree)
[ô]Convert the return values from LARGE_INTEGER to doubles
dblAvailable = CLargeInt(liAvailable.lowpart, liAvailable.highpart)
dblTotal = CLargeInt(liTotal.lowpart, liTotal.highpart)
dblFree = CLargeInt(liFree.lowpart, liFree.highpart)
[ô]Display the results
Label1.Caption = [Ô]Available Space on [Ô] & sDrive & [Ô]\ is [Ô] & Format(dblAvailable / 1024 ^ 2, [Ô]0[Ô]) & [Ô] MB ([Ô] & Format(dblAvailable / 1024 ^ 3, [Ô]0[Ô]) & [Ô] GB) [Ô]
Label2.Caption = [Ô]Total Size on [Ô] & sDrive & [Ô]\ is [Ô] & Format(dblTotal / 1024 ^ 2, [Ô]0[Ô]) & [Ô] MB ([Ô] & Format(dblTotal / 1024 ^ 3, [Ô]0[Ô]) & [Ô] GB) [Ô]
[ô]
lresultused = dblTotal - dblFree
Label3.Caption = [Ô]Used Space on [Ô] & sDrive & [Ô]\ is [Ô] & Format(lresultused / 1024 ^ 2, [Ô]0.00[Ô]) & [Ô] MB ([Ô] & Format(lresultused / 1024 ^ 3, [Ô]0[Ô]) & [Ô] GB) [Ô]
[ô]
End Sub

Private Function CLargeInt(Lo As Long, Hi As Long) As Double
[ô]This function converts the LARGE_INTEGER data type to a double
Dim dblLo As Double, dblHi As Double
If Lo < 0 Then
dblLo = 2 ^ 32 + Lo
Else
dblLo = Lo
End If
[ô]
If Hi < 0 Then
dblHi = 2 ^ 32 + Hi
Else
dblHi = Hi
End If
[ô]
CLargeInt = dblLo + dblHi * 2 ^ 32
[ô]
End Function

Private Sub Command1_Click()
GetDiskSpace (Text1)
End Sub
MARLON 31/08/2009 16:10:26
#321488
Thank you very f****** much!
Tópico encerrado , respostas não são mais permitidas