Java工具类,支持根据指定文件扩展名(如.shp.zip)搜索所在文件夹路径

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class FileFolderFinder {
    
    /**
     * 查找指定路径下包含指定扩展名文件的文件夹路径
     * 
     * @param rootPath 根目录路径
     * @param extension 要搜索的文件扩展名(如".shp"或".zip")
     * @return 包含指定扩展名文件的文件夹路径列表
     */
    public static List<String> findFoldersWithExtension(String rootPath, String extension) {
        // 确保扩展名以点开头(如".shp"),如果用户忘记加点则自动添加
        String normalizedExtension = extension.startsWith(".") ? extension : "." + extension;
        File rootDir = new File(rootPath);
        if (!rootDir.exists() || !rootDir.isDirectory()) {
            throw new IllegalArgumentException("Invalid directory: " + rootPath);
        }
        return findFoldersWithExtension(rootDir, normalizedExtension);
    }
    
    /**
     * 递归查找包含指定扩展名文件的文件夹
     */
    private static List<String> findFoldersWithExtension(File directory, String extension) {
        List<String> result = new ArrayList<>();
        // 检查当前文件夹是否包含指定扩展名的文件
        if (hasFileWithExtension(directory, extension)) {
            result.add(directory.getAbsolutePath());
        }
        // 遍历子文件夹
        File[] files = directory.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isDirectory()) {
                    result.addAll(findFoldersWithExtension(file, extension));
                }
            }
        }
        return result;
    }
    
    /**
     * 检查文件夹是否包含指定扩展名的文件
     */
    private static boolean hasFileWithExtension(File directory, String extension) {
        String lowerExtension = extension.toLowerCase();
        File[] files = directory.listFiles();
        if (files != null) {
            for (File file : files) {
                if (file.isFile() && file.getName().toLowerCase().endsWith(lowerExtension)) {
                    return true;
                }
            }
        }
        return false;
    }
    
    // 使用示例
    public static void main(String[] args) {
        // 示例1:搜索.shp文件
        List<String> shpFolders = findFoldersWithExtension("D:/data", ".shp");
        System.out.println("包含.shp文件的文件夹路径:");
        shpFolders.forEach(System.out::println);
        
        // 示例2:搜索.zip文件
        List<String> zipFolders = findFoldersWithExtension("D:/data", ".zip");
        System.out.println("\n包含.zip文件的文件夹路径:");
        zipFolders.forEach(System.out::println);
    }
}

关键改进说明

  1. 通用化方法

    • findFoldersWithExtension(String rootPath, String extension) 作为公共接口
    • 自动处理扩展名格式(支持.shpshp两种输入方式)
  2. 健壮性处理

    • 自动添加扩展名前的点(shp.shp
    • 检查根目录是否存在
    • 大小写不敏感匹配(.SHP.Shp.shp 都会被识别)
  3. 功能覆盖

    • 通过传入不同扩展名支持多种文件类型搜索
    • 递归遍历所有子文件夹
    • 返回绝对路径列表

使用示例

// 搜索.shp文件所在文件夹
List<String> shpFolders = FileFolderFinder.findFoldersWithExtension(
    "C:/GIS_Data", 
    ".shp"  // 或 "shp"
);

// 搜索.zip文件所在文件夹
List<String> zipFolders = FileFolderFinder.findFoldersWithExtension(
    "C:/Archive", 
    ".zip"  // 或 "zip"
);

输出示例

假设目录结构:

C:/
└── GIS_Data/
    ├── Project1/
    │   ├── data.shp
    │   └── metadata.txt
    ├── Project2/
    │   └── data.zip
    └── Project3/
        ├── map.shp
        └── report.pdf

运行代码后输出:

包含.shp文件的文件夹路径:
C:\GIS_Data\Project1
C:\GIS_Data\Project3

包含.zip文件的文件夹路径:
C:\GIS_Data\Project2

注意事项

  1. 路径分隔符:在Windows系统中使用反斜杠\,但Java推荐使用正斜杠/或双反斜杠\\,例如:

    • C:/GIS_Data
    • C:\\GIS_Data
  2. 性能提示:对于大型目录结构,递归遍历可能较慢。如需优化,可添加最大深度参数。

  3. 空结果处理:如果未找到匹配文件夹,将返回空列表而非null

  4. 异常处理:当根目录不存在时抛出IllegalArgumentException,便于调用方处理。

通过传入不同的扩展名参数,可以灵活搜索.shp.zip或其他任何文件类型所在文件夹路径。