Klasör Boyutunu veren kod

Katılım
17 Eylül 2006
Mesajlar
119
Excel Vers. ve Dili
Excel 2003 Türkçe
Forumda dosya boyutunu veren kodu buldum ama, klasör boyutu veren bir kod bulamadım.
Aşağıdaki kod yanlış bir boyutu gösteriyor. Bu kodu nasıl değiştirmeliyim?

Örnek:

[A1] = Len("G:\Notlar")
[A2] = "Notlar" & " adlı klasör " & Format([A1], "#,##0") & " byte boyutundadır."
 

hamitcan

Uzman
Uzman
Katılım
1 Temmuz 2004
Mesajlar
7,737
Excel Vers. ve Dili
Excel 2019 Türkçe
Kod:
Sub klasor_boyutlari()
    Dim ds, f, f1, fc, s
    Set ds = CreateObject("Scripting.FileSystemObject")
    Set f = ds.GetFolder("C:\")
    Set fc = f.SubFolders
        For Each f1 In fc
            s = s + 1
            Sayfa1.Cells(s, "a") = f1.Name
            Sayfa1.Cells(s, "b") = f1.Size
        Next
End Sub
 

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,058
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
Aşağıdaki gibi deneyin.

Kod:
[A1] = "G:\Notlar"
deg = CreateObject("Scripting.FileSystemObject").GetFolder([A1]).Size
[A2] = "Notlar" & " adlı klasör " & Format(deg, "#,##0") & " byte boyutundadır."
 
Katılım
17 Eylül 2006
Mesajlar
119
Excel Vers. ve Dili
Excel 2003 Türkçe
Cevaplarınız için çok teşekkürederim. Biliyorum çok oldum ama. Benim asıl yapmak istediğim "Klasör Yedek Alma Programımda" ProgressBar kullanmak. Forumdan öğrendiğim kadarıyla proressbarın klasör değerine göre hesaplama yapması gerekiyormuş. Bu nedenle sizlere klasör boyutunu nasıl öğrenebilirim diye sormuştum ama yine işin içinden çıkamadım. Hata verdi.

Kod şu şekilde
Kod:
Private Sub UserForm_Initialize()
    ProgressBar1.Max = 100
    ProgressBar1.Min = 0.1
End Sub
Private Sub CommandButton1_Click()
  Dim i As Integer
  
  deg = CreateObject("Scripting.FileSystemObject").GetFolder("G:\Notlar").Size
  
  For i = 1 To deg
    ProgressBar1.Value = (i / deg) * 100
    Label1.Caption = Format(Int((i / deg) * 100), "%0")
    DoEvents
  Next i
End Sub
 

hamitcan

Uzman
Uzman
Katılım
1 Temmuz 2004
Mesajlar
7,737
Excel Vers. ve Dili
Excel 2019 Türkçe
Aslına bakarsanız, benim kullanmadığım nesne. Ama size arşivimdeki bir kodu vereyim. Kendinize uyarlamaya çalışın.
Kod:
Private Sub CommandButton1_Click()
         Dim AltSinir, UstSinir, Son_Deger
         AltSinir = 0
         Son_Deger = 100
         UstSinir = 10000000
         ProgressBar1.Max = UstSinir
         Do
            AltSinir = AltSinir + 1
            Son_Deger = Son_Deger + AltSinir ^ 2
            If Son_Deger > UstSinir Then Exit Do
            ProgressBar1.Value = Son_Deger                   ' ProgresBar'a değer ata
            ProgressBar1.Refresh                                   ' ProgressBar'ı  yenile
            DoEvents                                                      ' Diğer programların
         Loop Until AltSinir >= UstSinir                                 ' çalışmasına zaman tanı
End Sub
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,375
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
"FileCopy" gibi bir fonksiyonla yedekleme/kopyalama yapılacaksa, klasör boyutunu bilmek gereksiz görünüyor. Klasör boyutunu esas alarak yapılacak işlemde "Get" ve "Put" metotları ile aktarılan byte'lar toplam boyut ile karşılaştırılarak hesaplanabilir ve tam anlamda eşzamanlı olur.

Alternatif olarak klasördeki dosya sayısını öğrenerek de benzer işlemi yapabiliriz. P.barın max değeri dosya sayısı olur. "FileCopy", her işlemi bitirdiğinde değer 1 artırılır.

Dosya sayısını bulmak için şunu kullanabilrsiniz.

Kod:
deg = CreateObject("Scripting.FileSystemObject").GetFolder("G:\Notlar").Files.Count
 

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,058
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
Aslında Zeki beyin belirttiği gibi klasörü kopyalamak için dosyaların yada klasörün büyüklüğünü bilmeye gerek yoktur. Ancak sanırım siz görsellik adına böyle bir çalışmayı yapmak istiyorsunuz. Ben bir çalışma hazırladım. Bu çalışmada örneğin c:\ana klasöründeki dosyalar c:\deneme klasörüne kopyalanmaktadır. Kullanmış olduğum mantık şöyledir, Öncelikle kopyalanacak klasörün büyüklüğü bulunarak bu değer progressbarın max değerine atanmıştır. Daha sonra bir döngü ile dosyalar c:\deneme klasörüne sırasıyla kopyalanmıştır. Her dosyanın kopyalanmasında c:\deneme klasörünün büyüklüğü okunarak bu değer progressbarın değeri olarak atanmıştır. Böylece birebir eş zamanlı bir progressbar hareketi elde edilmiştir.

Kod:
Private Sub CommandButton1_Click()
deg = Int(CreateObject("Scripting.FileSystemObject").GetFolder("C:\ana").Size / 1000)
ProgressBar1.Min = 0
ProgressBar1.Max = deg
For Each dosya In CreateObject("Scripting.FileSystemObject").GetFolder("C:\ana").Files
FileCopy "C:\ana\" & dosya.Name, "C:\deneme\" & dosya.Name
deg1 = Int(CreateObject("Scripting.FileSystemObject").GetFolder("c:\deneme").Size / 1000)
ProgressBar1.Value = deg1
Label1.Caption = Format((deg1 / deg) * 100, "%0")
DoEvents
Next
End Sub
Not: Bu çalışamda klasör içindeki dosyalar aktarılır, alt klasörler söz konusu ise hata verir ve eşzamanlı çalışmaz. Dosyayı denemek isteyen üyelerimiz dosya yollarını kendilerine göre düzenleyebilirler. Aynı mantık dosya sayısı üzerindende yürütülebilir.
 

Ekli dosyalar

Üst