Genel Bakış
FileSystemObject (dosya sistemi nesnesi), Microsoft Scripting Runtime kitaplığında bulunan ve bilgisayardaki sürücülere, klasörlere ve dosyalara nesne yönelimli biçimde erişmenizi sağlayan nesnedir. VBA'daki Dir, Kill, MkDir gibi eski deyimlere göre çok daha zengindir: yol parçalama, kopyalama, taşıma, silme, klasör içeriğini listeleme ve metin dosyası okuma/yazma işlemlerini tek nesne üzerinden yapar.
Geç bağlama (late binding): Başvuru eklemeye gerek yoktur, kod başka bilgisayarlarda da sorunsuz çalışır. IntelliSense desteği sunmaz.
Erken bağlama (early binding): VBA Düzenleyicisi > Araçlar > Başvurular (VBE > Tools > References) penceresinde Microsoft Scripting Runtime kutusunu işaretleyin. Bu durumda nesne türleri (FileSystemObject, Folder, File, TextStream, Drive) doğrudan tanımlanabilir ve yazarken IntelliSense listesi açılır.
Çalışma bittiğinde nesne değişkenini Set fso = Nothing ile serbest bırakmak iyi bir alışkanlıktır. Dağıtacağınız çalışma kitaplarında genellikle geç bağlama tercih edilir, çünkü başvuru eksikliği "Kullanıcı tanımlı tür tanımlanmadı" ya da "Başvuru bulunamadı" hatalarına yol açabilir.
Files ve SubFolders koleksiyonları For Each döngüsüyle dolaşılır; bu sayede bir klasördeki tüm dosyaları listelemek birkaç satırlık iştir.
Varlık denetimi:
Yol işlemleri (dosya sistemine dokunmaz, yalnızca metni ayrıştırır):
Oluşturma, kopyalama, taşıma ve silme:
Nesne döndürenler: GetFile, GetFolder, GetDrive ve GetSpecialFolder ilgili nesneyi verir. GetSpecialFolder için 0 Windows klasörünü, 1 sistem klasörünü, 2 geçici (Temp) klasörü temsil eder.
TextStream üzerinde ReadLine, ReadAll, WriteLine, Write yöntemleri, AtEndOfStream özelliği ve işiniz bitince çağrılması gereken Close yöntemi bulunur.
Bu makro dosya sistemine eriştiği ve CreateObject kullandığı için burada çalıştırılmadı; sonuçlar sizin bilgisayarınızdaki klasör yapısına bağlıdır. Makro çalıştığında diskte bulunan bir dosya için B sütununa Dosya, C sütununa uzantısız ad, D sütununa uzantı yazılır; bulunan klasörler için B sütununda Klasör ve C sütununda klasör adı görünür; diskte olmayan yollar için B sütununda Bulunamadı yazar. GetBaseName, GetExtensionName ve BuildPath gibi yol yöntemleri dosyanın varlığına bakmaz, FileExists ve FolderExists ise gerçek denetim yapar.
Klasör ve dosya işlemleri içerdiği ve CreateObject ile MsgBox kullandığı için bu örnek burada çalıştırılmadı. Çalıştığında B2'den başlayarak klasördeki her dosya için bir satır oluşur: ad, uzantı, KB cinsinden boyut ve tarih-saat biçimli son değişiklik zamanı. Yalnızca o klasörün kendi dosyaları listelenir; alt klasörlerin içeriğini de almak isterseniz SubFolders koleksiyonunu dolaşan özyinelemeli (kendini çağıran) bir Sub yazmanız gerekir.
İlk satır için dosya adı Satis_2024.xlsx, uzantı xlsx ve klasör C:\Raporlar olarak yazılır. Diğer satırlar da aynı mantıkla ayrışır. Bu çıktı, FileSystemObject'in GetFileName, GetExtensionName ve GetParentFolderName yöntemlerinin verdiği sonuçla aynıdır; fark, FSO'nun bu işleri tek satırda yapması ve alışılmadık yol biçimlerinde daha güvenilir olmasıdır. Dosyanın diskte gerçekten bulunup bulunmadığını denetlemek, boyut ya da tarih bilgisi almak gibi işler içinse FileSystemObject gerekir.
Nesneyi oluşturma
FileSystemObject, VBA'nın kendi içinde değil, Scripting kitaplığında yer alır. Nesneye iki yolla ulaşabilirsiniz.Geç bağlama (late binding): Başvuru eklemeye gerek yoktur, kod başka bilgisayarlarda da sorunsuz çalışır. IntelliSense desteği sunmaz.
VBA
2 satır
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Erken bağlama (early binding): VBA Düzenleyicisi > Araçlar > Başvurular (VBE > Tools > References) penceresinde Microsoft Scripting Runtime kutusunu işaretleyin. Bu durumda nesne türleri (FileSystemObject, Folder, File, TextStream, Drive) doğrudan tanımlanabilir ve yazarken IntelliSense listesi açılır.
Dim fso As New Scripting.FileSystemObject
Çalışma bittiğinde nesne değişkenini Set fso = Nothing ile serbest bırakmak iyi bir alışkanlıktır. Dağıtacağınız çalışma kitaplarında genellikle geç bağlama tercih edilir, çünkü başvuru eksikliği "Kullanıcı tanımlı tür tanımlanmadı" ya da "Başvuru bulunamadı" hatalarına yol açabilir.
Önemli özellikler
FileSystemObject'in kendi üzerinde tek özellik vardır; asıl zenginlik, yöntemlerin döndürdüğü yardımcı nesnelerin özelliklerindedir.- Drives: Bilgisayardaki tüm sürücülerin Drive nesne koleksiyonudur. Her Drive nesnesinde DriveLetter, IsReady, TotalSize, FreeSpace ve DriveType özellikleri bulunur.
- Folder nesnesi (GetFolder ile alınır): Name, Path, Size, DateCreated, DateLastModified, ParentFolder, Files (dosya koleksiyonu) ve SubFolders (alt klasör koleksiyonu).
- File nesnesi (GetFile ile alınır): Name, Path, Size (bayt), Type, DateCreated, DateLastModified, Attributes ve ParentFolder.
Files ve SubFolders koleksiyonları For Each döngüsüyle dolaşılır; bu sayede bir klasördeki tüm dosyaları listelemek birkaç satırlık iştir.
Önemli yöntemler
Sık kullanılan yöntemleri işlevlerine göre gruplayabiliriz. Söz dizimleri nesne.Yöntem biçimindedir; köşeli parantez içindeki bağımsız değişkenler isteğe bağlıdır.Varlık denetimi:
- FileExists(FileSpec): Dosya varsa True döndürür.
- FolderExists(FolderSpec): Klasör varsa True döndürür.
- DriveExists(DriveSpec): Sürücü varsa True döndürür.
Yol işlemleri (dosya sistemine dokunmaz, yalnızca metni ayrıştırır):
- GetFileName(Path): Yolun son bileşenini, yani dosya adını uzantısıyla verir.
- GetBaseName(Path): Uzantısız adı verir.
- GetExtensionName(Path): Uzantıyı noktasız verir.
- GetParentFolderName(Path): Üst klasörün yolunu verir.
- BuildPath(Path, Name): Gerekirse ters eğik çizgi ekleyerek iki parçayı birleştirir.
- GetAbsolutePathName(PathSpec): Göreli yolu tam yola çevirir.
Oluşturma, kopyalama, taşıma ve silme:
- CreateFolder(Path): Klasör oluşturur; klasör zaten varsa hata verir.
- CopyFile(Source, Destination, [OverWriteFiles]): Dosya kopyalar; OverWriteFiles isteğe bağlıdır, varsayılanı True'dur. Kaynakta joker karakter (*, ?) kullanılabilir.
- CopyFolder(Source, Destination, [OverWriteFiles]): Klasörü alt öğeleriyle kopyalar.
- MoveFile(Source, Destination) ve MoveFolder(Source, Destination): Taşır.
- DeleteFile(FileSpec, [Force]): Dosyayı siler; Force isteğe bağlıdır, varsayılanı False'tur ve salt okunur dosyalar silinmez.
- DeleteFolder(FolderSpec, [Force]): Klasörü içindekilerle birlikte siler.
Nesne döndürenler: GetFile, GetFolder, GetDrive ve GetSpecialFolder ilgili nesneyi verir. GetSpecialFolder için 0 Windows klasörünü, 1 sistem klasörünü, 2 geçici (Temp) klasörü temsil eder.
Metin dosyası okuma, yazma ve sabitler
FileSystemObject metin dosyalarıyla çalışmak için TextStream nesnesi üretir.- CreateTextFile(FileName, [Overwrite], [Unicode]): Yeni metin dosyası oluşturur. Overwrite isteğe bağlıdır, varsayılanı True; Unicode isteğe bağlıdır, varsayılanı False'tur (Türkçe karakter için True verin).
- OpenTextFile(FileName, [IOMode], [Create], [Format]): Var olan dosyayı açar. IOMode için 1 okuma (ForReading), 2 yazma (ForWriting), 8 sona ekleme (ForAppending) değerleri kullanılır; varsayılan 1'dir. Create True ise dosya yoksa oluşturulur (varsayılan False). Format için 0 ASCII, -1 Unicode, -2 sistem varsayılanıdır; varsayılan 0'dır.
TextStream üzerinde ReadLine, ReadAll, WriteLine, Write yöntemleri, AtEndOfStream özelliği ve işiniz bitince çağrılması gereken Close yöntemi bulunur.
VBA
4 satır
Dim ts As Object
Set ts = fso.OpenTextFile("C:\Raporlar\gunluk.txt", 8, True)
ts.WriteLine "Kayıt: " & Format(Now, "dd.mm.yyyy hh:mm")
ts.Close
1. Dosya mı klasör mü kontrolü
A sütununda kontrol edilecek yollar yer alıyor. Aşağıdaki makro her yolun dosya mı, klasör mü olduğunu ya da bulunamadığını B sütununa; dosya veya klasör adını C sütununa; dosya uzantısını D sütununa yazar. Kodu Alt+F11 ile açtığınız VBA Düzenleyicisi'nde Ekle > Modül (Insert > Module) ile eklediğiniz standart modüle yapıştırın. Yollar kendi bilgisayarınıza göre değişeceğinden sonuçlar farklı olabilir.
VBA
28 satır
Option Explicit
' Satırlardaki yolların dosya mı klasör mü olduğunu denetler
Sub DosyaKontrol()
Dim fso As Object, ws As Worksheet
Dim i As Long, son As Long, yol As String
' Geç bağlama ile FileSystemObject oluştur
Set fso = CreateObject("Scripting.FileSystemObject")
Set ws = ActiveSheet
son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To son
yol = ws.Cells(i, 1).Value
If fso.FileExists(yol) Then
ws.Cells(i, 2).Value = "Dosya"
ws.Cells(i, 3).Value = fso.GetBaseName(yol)
ws.Cells(i, 4).Value = fso.GetExtensionName(yol)
ElseIf fso.FolderExists(yol) Then
ws.Cells(i, 2).Value = "Klasör"
ws.Cells(i, 3).Value = fso.GetBaseName(yol)
Else
ws.Cells(i, 2).Value = "Bulunamadı"
End If
Next i
Set fso = Nothing
End Sub
FileSystemObject
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Yol | Tür | Ad | Uzantı |
| 2 | C:\Raporlar\Satis_2024.xlsx | |||
| 3 | C:\Raporlar | |||
| 4 | C:\Raporlar\Ocak_Stok.csv | |||
| 5 | D:\Arsiv\Musteri_Listesi.xlsx | |||
| 6 | C:\Belgeler\Personel |
Yol KontrolüExcelDepo v1.0.0
2. Klasördeki dosyaları listeleme
A2 hücresine bir klasör yolu yazılmış. Makro bu klasördeki dosyaları GetFolder ve Files koleksiyonuyla dolaşır; her dosyanın adını, uzantısını, KB cinsinden boyutunu ve son değişiklik tarihini B:E sütunlarına satır satır yazar. Kodu standart bir modüle yapıştırın.
VBA
32 satır
Option Explicit
' A2 hücresindeki klasörün dosyalarını listeler
Sub KlasorListele()
Dim fso As Object, kl As Object, dsy As Object
Dim ws As Worksheet, satir As Long, yol As String
Set ws = ActiveSheet
yol = ws.Range("A2").Value
Set fso = CreateObject("Scripting.FileSystemObject")
' Klasör yoksa hata vermeden çık
If Not fso.FolderExists(yol) Then
MsgBox "Klasör bulunamadı: " & yol, vbExclamation
Exit Sub
End If
Set kl = fso.GetFolder(yol)
satir = 2
' Klasördeki her dosya için bilgileri yaz
For Each dsy In kl.Files
ws.Cells(satir, 2).Value = dsy.Name
ws.Cells(satir, 3).Value = fso.GetExtensionName(dsy.Path)
ws.Cells(satir, 4).Value = Round(dsy.Size / 1024, 1)
ws.Cells(satir, 5).Value = dsy.DateLastModified
satir = satir + 1
Next dsy
ws.Range("E2:E" & satir).NumberFormat = "dd.mm.yyyy hh:mm"
Set fso = Nothing
End Sub
FileSystemObject
Formülünü incelemek için bir hücre seçin.| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Klasör Yolu | Dosya Adı | Uzantı | Boyut (KB) | Son Değişiklik |
| 2 | C:\Raporlar |
Dosya ListesiExcelDepo v1.0.0
3. FileSystemObject olmadan yol ayrıştırma
FileSystemObject'in GetFileName, GetExtensionName ve GetParentFolderName yöntemleri yalnızca metin ayrıştırır. Yalnızca yol metniyle çalışacaksanız aynı sonucu VBA'nın InStrRev, Left ve Mid işlevleriyle de alabilirsiniz. Aşağıdaki makro A sütunundaki tam yoldan dosya adını B, uzantıyı C ve klasörü D sütununa yazar; nesne oluşturmadığı için hiçbir kitaplık ya da güvenlik ayarına bağlı değildir. Kodu standart bir modüle yapıştırın.
VBA
30 satır
Option Explicit
' Tam yoldan dosya adı, uzantı ve klasörü ayırır (FSO kullanmadan)
Sub YolParcala()
Dim ws As Worksheet
Dim i As Long, son As Long
Dim yol As String, ad As String
Dim k As Long, n As Long
Set ws = ActiveSheet
son = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
For i = 2 To son
yol = ws.Cells(i, 1).Value
' Son ters eğik çizginin konumu
k = InStrRev(yol, "\")
If k > 0 Then
ad = Mid(yol, k + 1)
ws.Cells(i, 4).Value = Left(yol, k - 1)
Else
ad = yol
End If
ws.Cells(i, 2).Value = ad
' Son noktadan sonrası uzantıdır
n = InStrRev(ad, ".")
If n > 0 Then ws.Cells(i, 3).Value = Mid(ad, n + 1)
Next i
End Sub
FileSystemObject
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Tam Yol | Dosya Adı | Uzantı | Klasör |
| 2 | C:\Raporlar\Satis_2024.xlsx | Satis_2024.xlsx | xlsx | C:\Raporlar |
| 3 | C:\Raporlar\Ocak_Stok.csv | Ocak_Stok.csv | csv | C:\Raporlar |
| 4 | D:\Arsiv\Musteri_Listesi.xls | Musteri_Listesi.xls | xls | D:\Arsiv |
| 5 | C:\Belgeler\Personel\Izin_Takvimi.xlsm | Izin_Takvimi.xlsm | xlsm | C:\Belgeler\Personel |
| 6 | E:\Yedek\Notlar.txt | Notlar.txt | txt | E:\Yedek |
Yol AyrıştırmaExcelDepo v1.0.0
Kullanırken dikkat edin
- CreateObject ve güvenlik yazılımları: Bazı kurumsal bilgisayarlarda virüs koruma yazılımları ya da grup ilkeleri Scripting kitaplığını engelleyebilir. Bu durumda CreateObject satırında "ActiveX bileşeni nesne oluşturamıyor" (429) hatası alırsınız. Böyle bir ortamda Dir, MkDir, FileCopy ve Kill gibi yerleşik VBA deyimlerine dönmeniz gerekebilir.
- Windows'a özgüdür: FileSystemObject yalnızca Windows'taki Excel'de çalışır. Mac için Excel'de Scripting kitaplığı bulunmadığından aynı kod çalışmaz; taşınabilir bir çözüm gerekiyorsa yerleşik VBA işlevlerini kullanın.
- Silme işlemi geri alınamaz: DeleteFile ve DeleteFolder dosyaları Geri Dönüşüm Kutusu'na göndermez, kalıcı olarak siler; Excel'deki Geri Al da bu işlemi kurtarmaz. Silmeden önce FileExists ya da FolderExists ile denetim yapın, joker karakterli yolları (örneğin *.tmp) dikkatle deneyin ve mümkünse önce test klasöründe çalıştırın.
- Var olan klasörü yeniden oluşturmayın: CreateFolder, klasör zaten varsa "Dosya zaten var" (58) hatası verir. Önce FolderExists ile denetleyin. Ayrıca CreateFolder tek seferde yalnızca bir düzey oluşturur; C:\Raporlar\2024\Ocak yolunda üst klasörler yoksa hata alırsınız, her düzeyi sırayla oluşturmanız gerekir.
- Türkçe karakter ve kodlama: CreateTextFile ve OpenTextFile varsayılan olarak ASCII kullanır; Türkçe karakterler (ç, ğ, ı, ö, ş, ü) bozulabilir. Unicode bağımsız değişkenini True ya da Format değerini -1 yapın. UTF-8 kodlu dosyalar için FileSystemObject yetersiz kalır; bu durumda ADODB.Stream kullanılır.
- TextStream kapatılmalıdır: OpenTextFile ya da CreateTextFile ile açtığınız dosyayı işiniz bitince Close ile kapatın. Kapatılmayan dosya başka programlarca kullanımda görünür, yazılan veriler eksik kalabilir ve sonraki çalıştırmada "Erişim reddedildi" (70) hatası oluşabilir.
- İlgili konular:
- Dir işlevi: FileSystemObject'siz dosya ve klasör arama.
- CreateObject işlevi: Geç bağlama ile nesne oluşturma.
- MkDir, RmDir, Kill, FileCopy, Name deyimleri: Yerleşik klasör ve dosya işlemleri.
- Open, Print #, Line Input # deyimleri: Metin dosyası okuma ve yazma.
- Application.GetOpenFilename ve FileDialog: Kullanıcıdan dosya ya da klasör seçtirme.
- Workbooks.Open ve SaveAs yöntemleri: Excel çalışma kitabı açma ve kaydetme.
- ThisWorkbook.Path özelliği: Çalışma kitabının bulunduğu klasör.
- For Each...Next deyimi: Files ve SubFolders koleksiyonlarını dolaşma.
- InStrRev, Left, Mid işlevleri: Yol metinlerini elle ayrıştırma.