我想从只有.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文件。 谢谢,如果有人帮助我。
答案 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);
现在将包含具有给定扩展名的文件的所有文件夹(或上述名称)。