Другие варианты, предложенные здесь, хороши, однако другой альтернативой является объединение нескольких более простых FileFilters (что может быть излишним, конечно!)
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;
}
}
Затем просто объедините короткие, краткие FileFilters для случая Sub3, .scl и .awl. Пример FailFastFileFilter, который я показал выше, позволит вам указать null в качестве одного из фильтров (чтобы вы могли использовать встроенные операторы if, чтобы определить, применяются ли определенные FileFilters)
Для завершения приведу общее представление о том, как реализовать дочерние фильтры для случаев Sub1 и Sub3.
Во-первых, фильтр для исключения файлов с определенным расширением в каталоге:
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;
}
}
Затем исключить каталог:
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;
}
}
Настройка FailFastFileFilter будет выглядеть примерно так:
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);