-- Java SE

Walking the File Tree

FileVisitor & SimpleFileVisitor

Bir dosya ağacındaki tüm dosyaları recursive olarak gezmek istediğimizde FileVisitor interfaceini kullanılırız. FileVisitor implement edilirken gezme sürecinde belirli zamanlarda( erişimden önce, erişimden sonra, erişilirken, hata olursa gibi) yapılacaklar belirtilir. Bunun için 4 metod vardır.

1 – preVisitDirectory = Directory içerisindeki dosyalar ziyaret edilmeden önce çağırılır.
2 – postVisitDirectory = Directory içerisindeki dosyalar ziyaret edildikten sonra çağırılır. Eğer bir hatayla karşılaşılırsa, exception metoda geçilir.
3 – visitFile = Dosya ziyaret edilirken çağılır. Parametre olarak BasicFileAttributes alır. Örneğin bir dosyanın gizli olup olmadığını anlamak için DosFileAttributeView kullanılır.
4 – visitFileFailed = Dosyaya erişim olmadığında çağrılır. Belirli excepiton metoda parametre olarak geçilir. Exceptionı fırlatabilir, ya da konsolda yazdırabiliriz.

Eğer ki bu metodun hepsi birden lazım değilse FileVisitor‘ı implement etmek yerine SimpleFileVisitor sınıfını extend edebiliriz. SimpleFileVisitor sınıfı FileVisitor‘ı implement eder ve dosya ağacını gezerken bir hata olursa IOError fırlatılır. Bu sınıfı extend ederek sadece ihtiyaç duyulan metodlar implement edilebilir.

walkFileTree Metodları

FileVisitor implement edildikten sonra gezme işlemini başlatmak için Files sınıfı içerisindeki walkFileTree metodları kullanılır.

1 – walkFileTree(Path, FileVisitor)
2 – walkFileTree(Path, Set<FileVisitOption>, int, FileVisitor)

Birinci metoda parametre olarak bir başlangıç noktası ve FileVisitor nesnesi. Aşağıdaki kod parçasındaki gibi PrintFiles sınıfından bir nesne oluşturup metoda geçilebilir.

Path startingDir = ...;
PrintFiles pf = new PrintFiles();
Files.walkFileTree(startingDir, pf);

İkinci walkFileTree metodu ek olarak ziyaret edilecek dosya sayısı ve FileVisitOption enumları kullanılabilir. Eğer metodun tüm metodu gezmesi isteniyorsa Integer.MAX_VALUE parametre olarak kullanılabilir. Ayrıca FilveVisitOption enumu olarak FOLLOW_LINKS kullanılır. Bu sayede sembolik linkler de gezilir.

Aşağıdaki kod parçacığı metodun nasıl kullanacağını gösteriyor.

import static java.nio.file.FileVisitResult.*;

Path startingDir = ...;

EnumSet<FileVisitOption> opts = EnumSet.of(FOLLOW_LINKS);

Finder finder = new Finder(pattern);
Files.walkFileTree(startingDir, opts, Integer.MAX_VALUE, finder);

Akış Kontrolü

Bir dosya ağacını gezerken belirli bir dosyayı arıyor olabiliriz ve dosya bulunduğunda işlemin sona ermesini isteyebiliriz ya da belirli dosyaları atlamak isteyebiliriz.

FileVisitor metodları FileVisitResult değerleri dönderir. Bu değerlere göre gezme süreci kontrol edilebilir.

CONTINUE = Sürecin devam etmesini belirtir. Eğer preVisitDirectory metodu CONTINUE dönderirse, directory ziyaret edilir.
TERMINATE = Sürecin iptalini belirtir. Bu değer dönderildikten sonra hiçbir metod çağırılmaz.
SKIP_SUBTREE = PreVisitDirectory metodu bu değeri dönderdiğinde belirtilen directory ve subdirectoryler atlanır. Buna ağacı budama denir.
SKIP_SIBLINGS = preVisitDirectory metodu bu değeri dönderdiğinde belirtilen directory ziyaret edilmez, postVisitDirectory metodu çağırılmaz.  Eğer postVisitDirectory metodu bu değeri dönderirse siblings(aynı seviyedeki) dosyalar ziyaret edilmez.

Aşağıdaki kod parçasında “sccs” adlı dosyalar atlanır, ziyaret edilmez.

import static java.nio.file.FileVisitResult.*;

public FileVisitResult
     preVisitDirectory(Path dir,
         BasicFileAttributes attrs) {
    (if (dir.getFileName().toString().equals("SCCS")) {
         return SKIP_SUBTREE;
    }
    return CONTINUE;
}

Aşağıdaki kod parçasında belirli bir dosya aranır ve bulunduğunda süreç bitirilir.

import static java.nio.file.FileVisitResult.*;

// The file we are looking for.
Path lookingFor = ...;

public FileVisitResult
    visitFile(Path file,
        BasicFileAttributes attr) {
    if (file.getFileName().equals(lookingFor)) {
        System.out.println("Located file: " + file);
        return TERMINATE;
    }
    return CONTINUE;
}

Daha iyi anlaşılması açısından tüm metodları kullanıldığı bir program yazalım ve aşağıdaki resimde belirtilen dosya yapısı üzerinde çalıştıralım.

 

Mesela File3’ten sonraki kısımlar ziyaret edilmesin ve her preVisitDirectory ve postVisitDirectory metodları çalıştığında konsola yazdıralım.

Program Çıktısı

Gidilen directory : D:\File >>> preVisitDirectory içerisinde yazdırıldı.
Gidilen directory : D:\File\File2 >>> preVisitDirectory içerisinde yazdırıldı.
 ***** File3 dosyasını ziyaret etmedim. >>> preVisitDirectory içerisinde yazdırıldı.
Regular file: D:\File\File2\TXT3.txt (0bytes) 
Oluşturulma tarihi : 2017-02-26T09:52:18.702625Z
Directory: D:\File\File2 >>> postVisitDirectory içerisinde yazdırıldı.
Regular file: D:\File\TXT1.txt (3bytes) 
Oluşturulma tarihi : 2017-02-23T06:48:07.693258Z
Regular file: D:\File\TXT2.txt (3bytes) 
Oluşturulma tarihi : 2017-02-23T06:48:07.693258Z
Directory: D:\File >>> postVisitDirectory içerisinde yazdırıldı.

 

Yorum bırak

Yorum