用于过滤文件的正则表达式模式

时间:2015-12-01 11:15:41

标签: java regex file fileutils

我只想要名字中包含固定模式的文件,但我的代码是复制所有文件。

我正在使用的代码是:

{{1}}

对模式匹配有效的示例文件名:2 015.11.30.x ivnr.stats

3 个答案:

答案 0 :(得分:1)

每次使用

找到符合条件的文件名时,都会将整个源目录复制到目标目录
FileUtils.copyDirectory(source, dest);

您需要复制单个文件,因为只应复制满足您条件的文件,并且不应对与该模式匹配的每个文件重复复制过程:

FileUtils.copyFileToDirectory(listOfFiles[i], dest);

答案 1 :(得分:1)

本声明

FileUtils.copyDirectory(source, dest);

是你的问题所在。此方法只是将源文件及其中的所有内容复制到dest目录。

相反,您只需要复制与您的模式匹配的文件。所以喜欢这个

if (filename.endsWith(".x") && filename.contains(pattern)){
        try {
            FileUtils.copyFileToDirectory(listOfFiles[i], dest) );
        } catch (IOException e) {
            e.printStackTrace();
        }
}

希望这会有所帮助:)

答案 2 :(得分:0)

为什么在列出文件后对模式进行比较然后再次迭代只是使用List Files with filter过滤文件,并且满足条件的文件会复制它们。

List files using pattern找到更多信息和帮助。

还有一点,为什么要使用FileUtils.copyDirectory来复制文件,然后使用nio file copy

示例代码:

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);

        }
    }