【问题标题】:Issue with wildcard directory search通配符目录搜索问题
【发布时间】:2018-09-12 17:38:08
【问题描述】:

我在尝试使用通配符验证目录中是否存在文件时遇到了问题。

该方法应该确定是否可以在当前目录中找到名称为 FAACIFP_(year)(cycle).DAT 的文件。

我尝试使用 IF/ELSE 运行 PathMaker.matches("glob:FAACIFP_18"),当我测试它时,它总是评估为 TRUE。所以,我尝试了一个 lambda 函数,它找不到文件。

下面的 lambda 不应该打印文件名,还是我误解/误用了它?

static void getCnvrtdCifpName() throws IOException{
        String cnvFileName = "FAACIFP_"+Year.now()
                .format(DateTimeFormatter.ofPattern("yy"));
        Path cnvFilePath = Paths.get(System.getProperty("user.dir"));
        Files.find(cnvFilePath,0,(path,attr) -> 
                path.getFileName().startsWith(cnvFileName)).forEach(System.out::println);
        System.out.println("EVALUATING METHOD....\t SEARCH PATH: "+cnvFilePath
                +" \n\t\t\t FILE STRING: "+cnvFileName);
    }

输出:

run:
Located RAW CIFP file FAACIFP18

EVALUATING METHOD....    SEARCH PATH: C:\Users\u314170\Documents\Personal\Java\NetBeans\A424Parser 
             FILE STRING: FAACIFP_18
BUILD SUCCESSFUL (total time: 0 seconds)

【问题讨论】:

  • FAACIFP18 没有_(FAACIFP_18)?
  • 那是我的错......我有两种方法正在运行,一种是寻找“FAACIFP(year)”,它可以工作并输出“RAW CIFP file FAACIFP(year)”。这是查看文件是否已转换为“FAACIFP_(year)(cycle)”的第二种方法。我有其他一切工作,只是没有找到通配符。
  • 哈! path.getFileName().startsWith(cnvFileName) 应该是 path.getFileName().toString().startsWith(cnvFileName) 并且深度可能是 1。
  • 谢谢,乔普!我想出了另一种方法来实现我的目标。但是,我将测试您的方法,以便获得更好的经验。我肯定在努力解决的一件事是方法链接的顺序。那,并在 OOP 方面重新思考。这条老狗开始用 MS-BASIC 编程,并在这里/那里涉足 Pascal 和 C。所以,OOP 是一种看待事物的新方式。再次感谢您的帮助!

标签: java file wildcard


【解决方案1】:

两个问题: 1)将 find 调用中的 maxdepth 更改为 1(从零开始) 2) path.getFileName() 返回一个完整的路径名。您将只想评估文件名部分(查看 getName(getNameCount()-1)

【讨论】:

  • 我试过了,得到了相同的输出。它仍然没有打印 lambda 的文件名。我只得到路径和搜索字符串。
  • 我无法确定您当前的代码是什么样的,但我会尝试以下方法。 1) 将过滤器 "path.getFileName().startsWith(cnvFileName)" 替换为 true ,然后您将看到 'user.dir' 目录中的所有文件。正如我在第一条评论中提到的,这些将是完整的路径名,而不仅仅是文件名。 2) 你可能还想打印出 user.dir 的值,这可能不是你想的那样。 3)根据需要更正目录名称以进行搜索,并根据需要调整您的过滤器代码。
【解决方案2】:

经过建议,我终于找到了解决办法:

static void getCnvrtdCifpName() throws IOException{
        String cnvFileName = "FAACIFP_"+Year.now()
                .format(DateTimeFormatter.ofPattern("yy"));
        Path cnvFilePath = Paths.get(System.getProperty("user.dir"));
        DirectoryStream<Path> cnvFileStream = Files.newDirectoryStream(cnvFilePath,cnvFileName+"*");
        System.out.println("EVALUATING METHOD....\t SEARCH PATH: "+cnvFilePath
                +" \n\t\t\t FILE STRING: "+cnvFileName);
        List cnvDirList = new ArrayList();
        for(Path file: cnvFileStream){
            cnvDirList.add(file.getFileName().toString());
        }
        cnvFileStream.close();
        System.out.println(cnvDirList);
    }

有输出:

run:
EVALUATING METHOD....    SEARCH PATH: C:\Users\u314170\Documents\Personal\Java\NetBeans\A424Parser 
             FILE STRING: FAACIFP_18
[FAACIFP_1808.dat, FAACIFP_1810.txt, FAACIFP_1811.txt]
BUILD SUCCESSFUL (total time: 0 seconds)

在学习 Java 的过程中,我真的很享受解决问题的挑战。那里有很多资源,以及解决问题的许多不同方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多