Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Rozmiar katalogu
anonim




Typ: Nie zarejestrowany
Rozmiar katalogu

Otóż taki problem... jak odczytac rozmiar wszystkiego co sie znajduje w danym katalogu?  Kombinowalem z funkcja FileLen() tzn. robilem dir katalogu i dodawalem rozmiar pliku dla kazdego z osobna.problem natomiast mam gdy w jakims podkatalogu mam jeszcze kilka innych... np. chce sprawdzic rozmiar 'c:\bubu\' ale w nim znajduje sie jeszcze 'c:\bubu\misu\rysiu\' i 'c:\bubu\misiu\niedzwiadek' jak juz wejde do katalogu 'c:\bubu\misu\rysiu\' i zsumuje wielkosci wszystkich plikow to jak wyjsc z tego katalogu i wejsc do 'c:\bubu\misiu\niedzwiadek' aby sprawdzic jego zawartos? ponizej moj kod:

katalog = "c:\bubu\
tmpKat = katalog
Usun:
tmpPlik = Dir(tmpKat + "*.*", vbArchive + vbReadOnly + vbHidden + vbSystem)
        While tmpPlik <> ""
        l = l + FileLen(tmpKat + tmpPlik)
        tmpPlik = Dir
    Wend
nKat = Dir(tmpKat + "*.", vbDirectory + vbReadOnly + vbHidden + vbSystem + vbArchive)
    While nKat = "." Or nKat = ".."
    nKat = Dir(, vbDirectory)
Wend
If nKat <> "" Then
    tmpKat = tmpKat & nKat & "\"
    GoTo Usun
    Else
    If tmpKat = katalog Then
    End
    Else
    ' tu nie wiem co dac
    GoTo Usun
    End If

01-12-2004 16:01
  
kicaj




Typ: neutral
Postów: 271
Zarejestrowany: Aug 2003

musisz stworzyc funkcje rekurencyjna, tzn. taka ktroa sie sama wywoluje

czyli robirz dir katalogu:
jeli trafiasz na pliki jeste wszystko okey, zas jesli trafisz na katalog wywolujesz TwojaFun("KatalogDalej" ona Ci np. zwroci jakies tam wartosci ktore sobie dodasz itd, rozumiesz?

01-12-2004 17:06
Pokaż profil kicaj  Wyślij email do kicaj        3914568
anonim




Typ: Nie zarejestrowany

wolalbym gotowy przyklad jezeli to nie jest takie mozolne do napisania

01-12-2004 17:35
  
kicaj




Typ: neutral
Postów: 271
Zarejestrowany: Aug 2003

Private Sub Form_Load()
Dim B As Double, KB As Double, MB As Double, GB As Double
B = WielKat("C:\Downloads"
KB = B / 1024
MB = KB / 1024
GB = MB / 1024
End Sub


Public Function WielKat(katalog As String) As Double

Dim tmpKat As String, tmpFile As String
Dim Tablica() As String
Dim a As Long, Razem As Double
On Local Error GoTo blad:

WielKat = 0
ReDim Tablica(0)
tmpKat = IIf(Right(katalog, 1) = "\", katalog, katalog & "\"

tmpFile = Dir(tmpKat, vbReadOnly Or vbHidden Or vbSystem Or vbDirectory Or vbArchive)
Do While Not tmpFile = ""
If (tmpFile <> "." And (tmpFile <> ".." And (GetAttr(tmpKat & tmpFile) And vbDirectory) Then
  Tablica(UBound(Tablica)) = tmpFile
  ReDim Preserve Tablica(UBound(Tablica) + 1)
ElseIf (tmpFile <> "." And tmpFile <> ".." Then
  Razem = Razem + FileLen(tmpKat & tmpFile)
End If
tmpFile = Dir
Loop

For a = 0 To UBound(Tablica) - 1
Razem = Razem + WielKat(tmpKat & Tablica(a))
Next a
blad:
WielKat = Razem
End Function


' Latwo powiedziec zrobcie mi :-) pomeczyl by sie troszke :-) mlody programisto
pozdr

01-12-2004 20:53
Pokaż profil kicaj  Wyślij email do kicaj        3914568
kicaj




Typ: neutral
Postów: 271
Zarejestrowany: Aug 2003

zamiast emot inkon wstaw ) nawias zamkniety

01-12-2004 20:54
Pokaż profil kicaj  Wyślij email do kicaj        3914568
anonim




Typ: Nie zarejestrowany

DZIEKUJE SERDECZNIE!!jak to zobaczylem to stwierdzilem ze sam bym tego nie zrobil, wiec dzieki wielkie, a i tak nie mam wystwiona kawe na lawe bo musze jeszcze to rozszyfrowac i zrozumiec

02-12-2004 13:49
  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

A nie lepiej użyć funkcji FindFirst i FindeNext - kod by ci się skrócił i działałby pewnie szybciej.

Pozdrawiam


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

02-12-2004 15:03
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
anonim




Typ: Nie zarejestrowany

gdzie znajde opis do FindFirst i FindeNext nie mam pojecia jak sie tym poslugiwac...

02-12-2004 16:21
  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

to są funkcje API - jak będę miał czas to zapodam przykładowy kod


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

02-12-2004 16:35
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Dim Path As String
Dim Size As Double

Private Type FILETIME
  dwLowDateTime    As Long
  dwHighDateTime    As Long
End Type

Private Type WIN32_FIND_DATA
  dwFileAttributes  As Long
  ftCreationTime    As FILETIME
  ftLastAccessTime  As FILETIME
  ftLastWriteTime  As FILETIME
  nFileSizeHigh    As Long
  nFileSizeLow      As Long
  dwReserved0      As Long
  dwReserved1      As Long
  cFileName        As String * 260
  cAlternate        As String * 14
End Type

Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Public Function TrimNull(Item As String) As String

    Dim pos As Integer
   
    pos = InStr(Item, Chr$(0))
    If pos Then Item = Left$(Item, pos - 1)
    TrimNull = Item
 
End Function


Public Sub DirSize(ByVal Katalog As String)
   
Dim hFile As Long
Dim fName As String
Dim fExt As String
Dim WFD As WIN32_FIND_DATA

fName = Katalog & "*.*"
hFile = FindFirstFile(fName, WFD)

If hFile > 0 Then
            Call IsDirectory(WFD, Katalog)
        While FindNextFile(hFile, WFD)
            Call IsDirectory(WFD, Katalog)
        Wend
End If
FindClose hFile
End Sub

Private Sub IsDirectory(WFD As WIN32_FIND_DATA, ByVal Katalog As String)
Dim sName As String

sName = TrimNull(WFD.cFileName)

If sName <> "." And sName <> ".." Then
    If (WFD.dwFileAttributes And vbDirectory) And vbDirectory Then
            Call DirSize(Katalog & sName & ""
    Else
            Size = Size + WFD.nFileSizeLow
    End If
End If
End Sub


Wywołanie funkcji:


Private Sub Form_Load()
Call DirSize("C:Windows"
MsgBox Left$(((Size / 1024) / 1024), 3) & "MB"
End Sub


Hehe - chyba się troche pomyliłem co do długości kodu ale za to z wykorzystaniem API masz większa gwarancję ze program nie nawali

Poza tym możesz odczytać inne dane dotyczące pliku

A tak na marginesie żeby porównać szybkośc działania wstaw sobie dwa Buttony i dla jednego wywołaj moją funkcję a dla drugiego funkcję Kicaj

Aż sie zdziwisz

P.s. Zapomniałem dodać że zmienna Size jest zmienną globalną także musisz ja zerować dla każdego wyliczenia rozmiaru katalogu

Pozdrawiam

[Post edytowany dnia 05-12-2004 10:48 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

02-12-2004 21:21
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
kicaj




Typ: neutral
Postów: 271
Zarejestrowany: Aug 2003

Dzieki DJK chlopaka chcalem tylko naprowadzic, to jest najprostsza metoda bez API
i teraz porownaj dlugosci zrozumialosc kodu

03-12-2004 03:24
Pokaż profil kicaj  Wyślij email do kicaj        3914568
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

No napisałem, że pomyliłem się trochę co do długości ( w sumie właściwy kod nie jest taki długi tylko deklaracje sporo zajmują) ale za to jaka jest różnica w szybkości  - najlepiej to widać wyliczając rozmiar np. katalogu Windows

No spoko - zawsze lepsza jakaś rada niż nic

Pozdrawiam

[Post edytowany dnia 03-12-2004 09:36 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

03-12-2004 09:32
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
Wszystkich odpowiedzi: 11 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1