【问题标题】:How to get file from directory with pattern/filter如何使用模式/过滤器从目录中获取文件
【发布时间】:2012-11-10 23:54:33
【问题描述】:

我必须从 PDF 文件目录中获取文件。我有一个问题,我没有一个字段来合并所有数据来查找文件。

这是一个例子:

文件名:

Comp_20120619_170310_2_632128_FC_A_8_23903.pdf

文件名生成:

Comp_20120619_--------_2_632128_FC_A_8_23903.pdf

我没有字段 "--------" 来制作文件完整名称。

我正在尝试使用File.list,但找不到正确的文件。

【问题讨论】:

  • 我不太懂java,但是“Comp_20120619_*_2_632128_FC_A_8_23903.pdf”呢?
  • 我想这些,但它不起作用。谢谢!

标签: java regex file filter directory


【解决方案1】:

希望它有效..

String[] pdfFiles= yourDir.listFiles(getFileNameFilterMachingWithFileName("Comp_20120619_"));



private FilenameFilter getFileNameFilterMachingWithFileName(final String 
fileNameStart) {
        return new FilenameFilter() {
            @Override
             public boolean accept(File dir, String name) {
               return (name.toUpperCase().startsWith(fileNameStart.toUpperCase()) && name.toUpperCase().endsWith(".PDF"));          
             }
        };
    }

【讨论】:

  • 请在您的回答中添加一些解释。
  • listFiles with file name filter 将只为您提供符合您的过滤条件的文件。在这里,我只选择名称以提到的标准开头的文件(作为参数传递给方法 getFileNameFilterMacchingWithFileName("Comp_20120619_"))并以“.pdf”扩展名结尾,只是为了只选择 pdf。这也是以不区分大小写的方式进行比较,以选择所有文件,即使在具有区分大小写文件系统的 linux 等操作系统上也是如此。
  • 你能把你的评论放在答案本身吗?
【解决方案2】:

你可以使用 WildcardFileFilter (org.apache.commons.io.filefilter)

代码看起来很简单:

FilenameFilter filenameFilter = new WildcardFileFilter("Comp_20120619_*_2_632128_FC_A_8_23903.pdf");
String[] pdfFileNames = yourDir.list(filenameFilter);
if(pdfFileNames != null ) {
    for (String pdfName : pdfFileNames)

【讨论】:

    【解决方案3】:

    您可以定义 FilenameFilter 来匹配文件名,如果文件名与您要查找的内容匹配,则返回 true。

        File dir = new File("/path/to/pdfs");
        File[] files = dir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.matches("Comp_20120619_[^_]*_2_632128_FC_A_8_23903.pdf");
            }
        });
    

    listFiles() 方法返回一个 File 对象数组。这是有道理的,因为可能有多个文件与该模式匹配(至少在理论上,尽管不一定在您的系统中)。

    我使用正则表达式匹配文件名,使用[^_]* 匹配您不确定的部分。但是,如果文件名匹配,您可以使用任何将返回布尔值的函数。例如,您可以使用 startsWithendsWith 代替正则表达式。

    【讨论】:

    • 谢谢马丁,我正在尝试使用这个正则表达式,我会告诉你结果。我动态构建文件名的其他部分,例如:"Comp_"+date+"*"+fbo.suc()+""+fbo.trans()+" i>"+fbo.type()+""+fbo.letter()+""+fbo.pointvta()+"_"+fbo.ticketnumber()+".pdf";
    • 请记住,它是一个正则表达式,而不是一个文件 glob。所以如果你想匹配任何文本,它是“.*”而不是“*”。不要忘记在你的正则表达式中添加下划线!
    • 您还需要转义点,因为正则表达式中的点表示“任何字符”。所以它应该是“Comp_20120619_[^_]*_2_632128_FC_A_8_23903\\.pdf”。 (需要两个反斜杠,因为您还需要遵守 java 转义规则:字面上的两个反斜杠意味着字符串中的一个)
    • 如何从accept方法外部传递正则表达式?
    【解决方案4】:

    list() 有什么问题?

    File folder = new File("path/to/pdffilefolder");
    String[] allFilesInThatFolder = folder.list();
    // contains only files, no folders.
    

    【讨论】:

    • 我设置的过滤器有问题,所以这些方法返回不同的文件。
    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 2023-03-26
    • 2011-01-14
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    相关资源
    最近更新 更多