【问题标题】:Java Path-matcher: Check the files or directories are present with wild-chars and patternsJava Path-matcher:检查文件或目录是否存在通配符和模式
【发布时间】:2017-12-12 09:55:16
【问题描述】:

我有一个下面的 CSV 字符串,我想检查给定的文件或目录是否存在。

private static String dir = "/Users/swapnil.kotwal/Swapnil/myproject/build/WEB-INF/classes/test/";

private static String csvConnClasses = dir + "FirstTest*.class,"+ dir+"SecondTest.class,"+dir+"abcd/";

我尝试了下面的代码,但我通过 ant 运行它得到异常 java.lang.NoClassDefFoundError: org/aspectj/lang/Signature

       File dir = new File(cls.substring(0, cls.lastIndexOf("/")));
        String[] splits = dir.getAbsolutePath().split(dir.getPath());
        String basePath = splits[0] + "build/WEB-INF/classes/" + dir.getPath();
        dir = new File(basePath);
        if (dir.exists() && dir.isDirectory() && dir.list().length > 0) {
            final String className = getClassName(new File(cls));
            File[] files = dir.listFiles(new FileFilter() {

                public boolean accept(File file) {
                    System.out.println("File Name >>> " + file.getName());
                    return (file.getName().startsWith(className) && file.getName().endsWith(".class"));
                }
            });
            if (files.length == 0) {
                throw new BuildException(cls + " class not found - ");
            }

            if (classSet.contains(cls)) {
                dups.add(cls);
            }
            classSet.add(cls);
        } else
            throw new BuildException(cls + " directory not found - ");
    }

有人可以建议我使用 PathMatcher/Regex 来检查给定的文件和文件夹是否存在。

【问题讨论】:

  • aspectj/Signature 与您的代码有什么关系?为什么代码没有引用csvConnClasses?你为什么发布赏金然后接受你自己的答案?
  • CSV string 这是在哪里?
  • 我从一些我刚刚在这里硬编码的复杂机制中获取 CSV。
  • 我们使用Aspectj 库将类加载到ant build 类路径@RunTime。我使用了匿名内部类 new FileFilter,这在 ant build jar 操作期间给我带来了问题

标签: java regex file ant filepath


【解决方案1】:

我打算使用 Java NIO 程序来搜索具有 GLOB 模式的文件条目。

package com.test.inspector;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.StringTokenizer;

public class SearchFile {
    private static String dir = "/Users/swapnil.kotwal/Swapnil/myproject/build/WEB-INF/classes/test/";

    private static String csvConnClasses = dir + "FirstTest*.class,"+ dir+"SecondTest.class,"+dir+"abcd/";

    public static class SearchFileVisitor extends SimpleFileVisitor<Path> {

        private final PathMatcher pathMatcher;
        private int matchCount = 0;

        SearchFileVisitor(String globPattern) {
            pathMatcher = FileSystems.getDefault().getPathMatcher(
                    "glob:" + globPattern);
        }

        @Override
        public FileVisitResult visitFile(Path filePath,
                BasicFileAttributes basicFileAttrib) {
            if (pathMatcher.matches(filePath.getFileName())) {
                matchCount++;
                System.out.println(filePath);
            }
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult preVisitDirectory(Path directoryPath,
                BasicFileAttributes basicFileAttrib) {
            if (pathMatcher.matches(directoryPath.getFileName())) {
                matchCount++;
                System.out.println(directoryPath);
            }
            return FileVisitResult.CONTINUE;
        }

        public int getMatchCount() {
            return matchCount;
        }
    }

    public static void main(String[] args) throws IOException {
        if (null != csvConnClasses) {
            StringTokenizer st = new StringTokenizer(csvConnClasses, ",");
            while (st.hasMoreTokens()) {
                String cls = st.nextToken();
                // Removes all whitespaces and non-visible characters like tab,
                // \n etc.
                cls = cls.replaceAll("\\s+", "");
                Path rootPath = FileSystems.getDefault().getPath( cls.substring(0, cls.lastIndexOf("/")) );
        String globPattern = (new File(cls)).getName();

        SearchFileVisitor searchFileVisitor = new SearchFileVisitor(globPattern);
        Files.walkFileTree(rootPath, searchFileVisitor);
        System.out.println("Match Count: " + searchFileVisitor.getMatchCount());
       }
    }
  }
}

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2011-02-12
    • 1970-01-01
    • 2012-05-17
    相关资源
    最近更新 更多