如何从目录

时间:2018-03-29 17:40:53

标签: java

我想从只有.c和.h文件的目录中获取文件夹的名称。 下面是我的代码,但我不知道我究竟能获得只有.c和.h文件的文件夹名称。

File directory = new File(directoryName);
        //get all the files from a directory

        if(directory.exists()){
        File[] fList = directory.listFiles();
        for (File file : fList){
            if (file.isDirectory()){
                System.out.println(file.getName());
                System.out.println(file.getAbsolutePath());
            }

上面的代码将获取目录的输入路径,并在主目录存在时打印所有子文件夹或子目录的名称。并且还打印路径。现在我只想要目录中所有子文件夹的名称.c和.h文件。 谢谢,如果有人帮助我。

3 个答案:

答案 0 :(得分:0)

尝试查看Apache的DirectoryScanner

使用它我们可以提及要考虑/省略的文件扩展名类型

DirectoryScanner scanner = new DirectoryScanner();
scanner.setIncludes(new String[]{"*.c", "*.h"});

https://ant.apache.org/manual/api/org/apache/tools/ant/DirectoryScanner.html

答案 1 :(得分:0)

您可以使用列表和getParent()功能,如:

List<String> list;
File directory = new File(directoryName);

if(directory.exists()){
   File[] fList = directory.listFiles();
   for (File file : fList){
     if (file.isDirectory()){
        System.out.println(file.getName());
        if(file.getName().contains(".c") || file.getName().contains(".h"))
           list.add(file.getParent());
        System.out.println(file.getAbsolutePath());
     }
   }
}

for(String item : list) {
   System.out.println(item);
}

答案 2 :(得分:0)

我在这里给出了一个纯Java解决方案,但如果你的目录结构太深或目录有数千个文件,这可能无法解决。在这种情况下,您可能必须运行OS命令并将输出转储到Java中。例如,如果您使用Unix(或基于Unix)系统,则可以使用find列出目录并使用ProcessBuilder从Java调用命令。

现在的Java解决方案:

首先创建自定义FileNameFilter。这将根据您传递的扩展名过滤文件。

public class ExtensionFilter implements FilenameFilter {
    private String[] extensions;

    public ExtensionFilter(String... extensions) {
        this.extensions = extensions;
    }

    @Override
    public boolean accept(File dir, String name) {
        for (String extension : extensions) {
            if ( name.toLowerCase().endsWith(extension.toLowerCase()) ) {
                return true;
            }
        }
        return false;
    }
}

创建FileFilter以帮助您仅过滤目录(用于递归)

public class FolderFilter implements FileFilter {
    @Override
    public boolean accept(File path) {
        return path.isDirectory();
    }
}

使用递归来构建文件夹路径列表,其中包含具有给定扩展名的文件。

private static final FolderFilter folderFilter = new FolderFilter();

public List<String> recursiveSearch(File base, ExtensionFilter extFilter) {
        List<String> paths = new ArrayList<>();
        //Does current directory itself have files of given extension?
        if (base.list(extFilter).length > 0) { 
            paths.add(base.getPath()); //Use base.getName() here instead, for just name
        }
        // Recurse through current directory's subfolders
        for (File dir : base.listFiles(folderFilter)) {
            paths.addAll(recurse(dir, extFilter));
        }
        return paths;
}

最后,像这样调用它:

String basePath = "...";
File baseDir = new File(basePath);
ExtensionFilter extFilter = new ExtensionFilter(".c",".h");
List<String> folders = recurse(baseDir, extFilter);

现在将包含具有给定扩展名的文件的所有文件夹(或上述名称)。