指定扩展名的递归文件搜索
Recursive file search for designated extension
我正在使用 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("..");
}
我正在使用 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("..");
}