Java 指定扩展名的递归文件搜索

Java 指定扩展名的递归文件搜索,java,recursion,smb,smbj,Java,Recursion,Smb,Smbj,我正在使用SMBClient使用Java连接到我的SMB服务器 如何递归扫描整个SMB共享以获得扩展名为.mp4的所有文件的列表 这是我只扫描一个指定目录的代码: private void btnFileCountActionPerformed(java.awt.event.ActionEvent evt) { SMBClient client = new SMBClient(); try (Connection connection = client.connect("192.

我正在使用
SMBClient
使用Java连接到我的SMB服务器

如何递归扫描整个SMB共享以获得扩展名为.mp4的所有文件的列表

这是我只扫描一个指定目录的代码:

private void btnFileCountActionPerformed(java.awt.event.ActionEvent evt) {
    SMBClient client = new SMBClient();
    try (Connection connection = client.connect("192.168.X.XXX")) {
        AuthenticationContext ac = new AuthenticationContext("XXXXXXX@hotmail.com", "XXXXXX".toCharArray(), "Mastafin");
        Session session = connection.authenticate(ac);

        try (DiskShare share = (DiskShare) session.connectShare("Folder With Spaces")) {
            for (FileIdBothDirectoryInformation f : share.list("LOTS OF SUBDIRS TO SCAN", "*.mp4")) {
                System.out.println("File : " + f.getFileName());
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    } catch (Exception e) {
        System.out.println(e);
    }
}

下面是对代码的一些非常简单的调整,以使其递归地填充
ArrayList
。这不一定是最有效的方法,因为它会收集所有文件名,然后丢弃那些没有以
.mp4
结尾的文件名,但它应该为您提供一个简单的开始构建的地方

private void btnFileCountActionPerformed(java.awt.event.ActionEvent evt) {
    try (SMBClient client = new SMBClient()) {
        try (Connection connection = client.connect(SERVER)) {
            AuthenticationContext ac = new AuthenticationContext(USERNAME, PASSWORD.toCharArray(), WORKGROUP);
            try (Session session = connection.authenticate(ac)) {
                try (DiskShare share = (DiskShare) session.connectShare(SHARE)) {
                    List<String> files = new ArrayList<>();
                    listFiles(share, START_DIR, files);
                    files.removeIf(name -> !name.toLowerCase().endsWith(".mp4"));
                    files.forEach(System.out::println);
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace(System.err);
    }
}

private void listFiles(DiskShare share, String path, Collection<String> files) {
    List<String> dirs = new ArrayList<>();
    String extPath = path.isEmpty() ? path : path + "\\";
    for (FileIdBothDirectoryInformation f : share.list(path)) {
        if ((f.getFileAttributes() & FileAttributes.FILE_ATTRIBUTE_DIRECTORY.getValue()) != 0) {
            if (!isSpecialDir(f.getFileName())) {
                dirs.add(f.getFileName());
            }
        } else {
            files.add(extPath + f.getFileName());
        }
    }
    dirs.forEach(dir -> listFiles(share, extPath + dir, files));
}

private static boolean isSpecialDir(String fileName) {
    return fileName.equals(".") || fileName.equals("..");
}
private void btnFileCountActionPerformed(java.awt.event.ActionEvent evt){
尝试(SMBClient=new SMBClient()){
try(Connection=client.connect(SERVER)){
AuthenticationContext ac=新的AuthenticationContext(用户名、密码.toCharray()、工作组);
try(会话=连接。身份验证(ac)){
try(DiskShare=(DiskShare)会话。connectShare(share)){
列表文件=新的ArrayList();
列表文件(共享、启动目录、文件);
files.removeIf(name->!name.toLowerCase().endsWith(“.mp4”);
files.forEach(System.out::println);
}
}
}
}捕获(IOE异常){
e、 printStackTrace(System.err);
}
}
私有void列表文件(DiskShare共享、字符串路径、集合文件){
List dirs=new ArrayList();
字符串extPath=path.isEmpty()?路径:path+“\\”;
for(FileIdBothDirectoryInformation f:share.list(路径)){
if((f.getFileAttributes()&FileAttributes.FILE\u attributes\u DIRECTORY.getValue())!=0){
如果(!isSpecialDir(f.getFileName())){
dirs.add(f.getFileName());
}
}否则{
add(extPath+f.getFileName());
}
}
dirs.forEach(dir->listFiles(share,extPath+dir,files));
}
私有静态布尔isSpecialDir(字符串文件名){
返回fileName.equals(“.”| | fileName.equals(“…”);
}

不指定模式,因此结果包括文件和目录。递归调用目录,自己过滤掉非MP4文件。