【问题标题】:Regex pattern for filtering files用于过滤文件的正则表达式模式
【发布时间】:2016-03-05 07:05:12
【问题描述】:

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

我现在使用的代码是:

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.xivnr.stats

【问题讨论】:

  • 任何模式我的意思是文件名中的数字或子字符串。
  • 如果您提供一些示例文件名会有所帮助
  • 2015.11.30.x 或 ivnr.stats 这样的文件名!!
  • 在endsWith的.(点)之前添加\\(转义)。
  • 很明显你的代码有语法错误,但是你觉得copyDirectory有什么作用呢?

标签: java regex file fileutils


【解决方案1】:

为什么要在列出文件后进行模式比较然后再次迭代只需使用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);

        }
    }

【讨论】:

    【解决方案2】:

    每次使用找到与您的条件匹配的文件名时,您都会将整个源目录复制到目标目录

    FileUtils.copyDirectory(source, dest);
    

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

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

    【讨论】:

      【解决方案3】:

      此声明

      FileUtils.copyDirectory(source, dest);
      

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

      相反,您只需要复制与您的模式匹配的文件。就这样

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

      希望这会有所帮助:)

      【讨论】:

        猜你喜欢
        • 2010-09-26
        • 2023-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多