Шаблон регулярных выражений для фильтрации файлов
Я хочу только файлы, содержащие фиксированный шаблон в своем имени, но мой код копирует все файлы.
код, который я использую сейчас:
File source = new File("Any Source file path");
File[] listOfFiles = source.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
String filename = listOfFiles[i].getName();
if (filename.endsWith(".x") && filename.contains(aPattern)) {
try {
FileUtils.copyDirectory(source, dest));
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Примеры имен файлов, которые действительны для сопоставления с образцом: 2015.11.30.x или ivnr.stats
3 ответа
Это утверждение
FileUtils.copyDirectory(source, dest);
где твоя проблема Этот метод просто копирует ваш исходный файл и все в нем в каталог dest.
Вместо этого вам нужно скопировать только тот файл, который соответствует вашему шаблону. Ну вот так
if (filename.endsWith(".x") && filename.contains(pattern)){
try {
FileUtils.copyFileToDirectory(listOfFiles[i], dest) );
} catch (IOException e) {
e.printStackTrace();
}
}
Надеюсь это поможет:)
Вы копируете весь исходный каталог в целевой каталог каждый раз, когда находите имя файла, соответствующее вашему состоянию, используя
FileUtils.copyDirectory(source, dest);
Вместо этого вам нужно скопировать один файл, так как должны копироваться только те файлы, которые соответствуют вашим условиям, и процесс копирования не должен повторяться для каждого файла, соответствующего шаблону:
FileUtils.copyFileToDirectory(listOfFiles[i], dest);
Зачем делать сравнение для шаблона после перечисления файлов, а затем повторять итерации, просто отфильтруйте файлы, используя List Files с фильтром, и файлы, которые удовлетворяют вашим условиям, скопируйте их.
Найти дополнительную информацию и помощь в список файлов, используя шаблон.
Еще один момент, почему вы используете FileUtils.copyDirectory
Вы хотите скопировать файлы, а затем использовать копию файла NIO.
Пример кода:
File source = new File("Any Source file path");
File[] listOfFiles = source.listFiles(new FilenameFilter()
{
public boolean accept(File dir, String name)
{
if(dir.isDirectory())//If you want to copy recursively to all sub-folders then return true and place proper checks
return false;
if(name satisfies my condition)
return true;
return false;
}
});
for (int i = 0; i < listOfFiles.length; i++)
{
if (listOfFiles[i].isFile())
{
Path sourcePath=FileSystems.getDefault().getPath(listOfFiles[i].getPath());
Path target=FileSystems.getDefault().getPath(destinationPath);
Files.copy(sourcePath, target, java.nio.file.StandardCopyOption.REPLACE_EXISTING);
}
}