2011-08-25 10 views
5

bazı iç dosyası hariç bir klasör kopyalamakJava Ben bu yapı ile bir klasör var

AnaKlasör

--Sub1 
     --File .scl 
     --File .awl 
     --Other files 
    --Sub2 
     --Files 
    --Sub3 
    --Sub4 

ben başka bir konuma kopyalamak istediğiniz ama sub3 kaçınılması ve (sarkan olmak istiyorum

FileUtils.copyDirectory(srcDir, dstDir, new FileFilter() { 
     public boolean accept(File pathname) { 
      // We don't want 'Sub3' folder to be imported 
      // + look at the settings to decide if some format needs to be 
      // excluded 
      String[] ignoreList= new String[]{ 
        !Settings.getSiemensOptionAWL() ? ".awl":"uselessStringWilNeverBeFound", 
        !Settings.getSiemensOptionSCL() ? ".scl":"uselessStringWilNeverBeFound", 
        "Sub3" 
      }; 

      return !(ignoreFile(pathname, ignoreList) && pathname 
        .isDirectory()); 
     } 
    }, true); 


    public static boolean ignoreFile(File file, String[] ignoreList) { 
     for (final String ignoreStr : ignoreList) 
      if (file.getAbsolutePath().contains(ignoreStr)) 
       return true; 
     return false; 
    } 
: durum) Sub1 İşte

bazı dosya ı şimdiye kadar yaptıklarından bir özdür

Görünüşte işe yarıyor. Ama bence çok çirkin bir çözüm .... Daha iyi bir yolu bilen var mı?

P.S.: Tabii Settings.getSiemensOptionAWL ait () sadece boolean fonksiyonu

+2

Dizinin tamamını yeni konuma kopyalamak kolay olabilir, ardından silebilirsiniz orada olmaması gereken dosyaları (bu kopyadan). Açıkçası bu, güdü temel işlevsellikten ziyade güvenlikle ilgili ise uygun olmayacaktır. –

+0

Neyi kastettiğimi görüyorum ... ama kullanıcının ne yaptıklarını değil, veri kopyalama riskiyle karşı karşıya kalmadığınızı hayal edin.(durum böyle değil ama temiz bir çözüme sahip olmak istiyorum) :) – Stefano

+0

bile ... görünüşte bazen işe yarıyor ama bazen öyle değil ... belki de aynı düşüncenin daha iyi bir yolu var! – Stefano

cevap

4

diğer seçenekler iyi, ancak başka bir alternatif (tabii ki, overkill olabilir ki!) birlikte yuva birden daha basit FileFilters etmektir Sonra

public class FailFastFileFilter implements FileFilter { 
    protected final List<FileFilter> children = new ArrayList<FileFilter>(); 

    public FailFastFileFilter(FileFilter... filters) { 
     for (FileFilter filter: filters) { 
      if (filter != null) 
       this.filters.add(filter); 
     }  
    } 

    public boolean accept(File pathname) { 
     for (FileFilter filter: this.filters) { 
      if (!filter.accept(pathname)) { 
       return false; // fail on the first reject 
      } 
     } 

     return true; 
    } 
} 

Sub3 case, .scl ve .awl case için kısa, özlü FileFilters'ı birleştirin. Yukarıda gördüğüm FailFastFileFilter, filtrelerden biri olarak null değerini belirtmenize izin verir (bu nedenle, belirli FileFilter'ların uygulanıp uygulanmadığını belirten ifadeler varsa satır içi satırları kullanabilirsiniz)

Tamamlama amacıyla, işte size genel bir fikir verilmiştir. Sub1 vakaları ve Sub3 davası için çocuk filtrelerini uyguluyorum.

İlk olarak bir dizin içindeki belirli uzantılı dosyaları hariç bir filtre: o benzer görünümde olacaktır FailFastFileFilter kurma

public class ExcludeDirFileFilter implements FileFilter { 
    protected final String name; 

    public ExcludeDirFileFilter(String name) { 
     this.name = name.toLowerCase(); 
    } 

    public boolean accept(File file) { 
     if (file.isDirectory() && file.getName().equalsIgnoreCase(name)) 
      return false; 
     else 
      return true; 
    } 
} 

:

public class ExcludeExtensionInDirFileFilter implements FileFilter { 
    protected final String parentFolder; 
    protected final String extension; 

    public ExtensionFileFilter(String parentFolder, String extension) { 
     this.parentFolder = parentFolder; 
     this.extension = extension.toLowerCase(); 
    } 

    public boolean accept(File file) { 
     if (!file.isDirectory() && file.getParentFile().getName().equalsIgnoreCase(parentFolder)) 
      return !file.getAbsolutePath().toLowerCase().endsWith(extension); 
     else 
      return true; 
    } 
} 
Sonra

bir dizin dışlamak

FileFilter filters = new FailFastFileFilter(
    new ExcludeDirFileFilter("Sub3"), // always exclude Sub3 
    (!Settings.getSiemensOptionAWL() ? new ExcludeExtensionInDirFileFilter("Sub1",".awl"), null), // Exclude Sub1/*.awl if desired 
    (!Settings.getSiemensOptionSCL() ? new ExcludeExtensionInDirFileFilter("Sub1",".scl"), null) // Exclude Sub1/*.scl if desired 
); 

FileUtils.copyDirectory(srcDir, dstDir, filters); 
-1

Bana oldukça temiz görünüyor benim kararım iade taht. Tüm bunları doğrudan arama koduna koymayın, böylece her zaman ona bakmak zorunda kalmazsınız. Tüm bu kodu gizleyen ve bunu anlamak için basit bir arayüz sağlayan kendi CopySubDir sınıfınızı oluşturun. Ardından çağıran kod temiz görünecektir.

1

Bu iplerin durumu taşa sabitlenmiş mi?

new FileFilter() { 
    public boolean accept(File pathname) { 
     String path = pathname.getAbsolutePath().toLowerCase(); 

     return (!pathname.isDirectory() || path.endsWith("sub3")) && 
      (!Settings.getSiemensOptionAWL() && path.endsWith(".awl")) && 
      (!Settings.getSiemensOptionSCL() && path.endsWith(".scl")); 
    } 
} 
+0

bu şekilde güzel görünüyor ama benim String sabit değil ... onlar yazılım ayarlarına bağlıdır ... – Stefano

+0

sadece gidiyor kodunuz/açıklamanız. Belki de, daha küçük, yapılandırma özellikli dosya filtrelerinden oluşan bir değişken filtre oluşturmak için dekoratör/sorumluluk modeli desenini kullanmalısınız. – vickirk

+0

Peter'ın cevabı boyunca bir şey! – vickirk

3

gibi Belki bir şey çirkinlik mutlaka faydalı bilgilerden bazılarını (vb dosya uzantıları, hangi dizeleri hangi madde aslında dizeleri,) Ayrıca, o dizi olacak kaybeder ki, ignoreFile() tanıtan geldiğini düşünüyorlar Son derece verimsiz olan hiyerarşinizdeki her dosya için yaratılmış. Bunun yerine, böyle bir şey düşünün: Burada önerilen

FileUtils.copyDirectory(srcDir, dstDir, new FileFilter() { 
    public boolean accept(File pathname) { 
     // We don't want 'Sub3' folder to be imported 
     // + look at the settings to decide if some format needs to be 
     // excluded 
     String name = pathname.getName(); 
     if (!Settings.getSiemensOptionAWL() && name.endsWith(".awl")) 
      return false; 
     if (!Settings.getSiemensOptionSCL() && name.endsWith(".scl")) 
      return false; 

     return !(name.equals("Sub3") && pathname.isDirectory()); 
    } 
}, true); 
+0

Bu temiz bir çözümdür, ancak dönüşten sonraki ilk terimin! PathName.equals ("Sub3") yerine! Name.equals ("Sub3") olması gerektiğini düşünüyorum. –

+0

Bu "FixDirectory()" bölümü düzeltildi ve netleştirildi ... –