我必须搜索可以在任何目录或驱动器中的文件。它应该与任何操作系统兼容。当我用Google搜索时,大多数代码遍历特定目录但不是完整文件系统。有没有办法有效地做到这一点?任何帮助或建议都将非常感激。
我从http://www.mkyong.com/java/how-to-traverse-a-directory-structure-in-java/得到的代码,但我们必须传递一些目录作为参数。有没有办法概括以获得所有位置?
public static void main (String args[]) {
displayIt(new File("C:\\"));
}
public static void displayIt(File node){
System.out.println(node.getAbsoluteFile());
if(node.isDirectory()){
String[] subNote = node.list();
for(String filename : subNote){
displayIt(new File(node, filename));
}
}
答案 0 :(得分:3)
Apache Commons-IO是这种操作的一个很好的API。对于Unix系统,你可以只使用root“/”,但这对windows不起作用,因此你必须要求所有的根并迭代它们:
File[] roots = File.listRoots();
Collection<File> files = new ArrayList<File>();
for(File root : roots) {
files.addAll(FileUtils.listFiles(
root,
new RegexFileFilter(<your regex filter>),
DirectoryFileFilter.DIRECTORY
));
}
答案 1 :(得分:1)
此类代码段将列出目录和子目录中的所有文件。您不必将任何文件添加到allFiles,您可以在那里进行检查。因为你还没有提供任何代码(所以我假设你没有尝试过任何东西)我会让你更新它;)
private void addFiles(File file, Collection<File> allFiles) {
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
allFiles.add(f);
addFiles(f, allFiles);
}
}
}
答案 2 :(得分:0)
如果你想通过递归来实现这一点,这里是DFS的代码,代码可能无法正常工作(我从不测试它),它没有优化,但它可能会给你一些如何解决问题的想法
File find(String directoryName, String pattern)
{
File currentDirectory = loadFile(directoryName);
for (String name: currentDirectory .list())
{
File children = loadFile(name)
if (children.isDirectory())
{
File file = find(name, pattern)
if (file !=null)
{
return file;
}
}
else
{
if (match(name,pattern)
{
return children;
}
}
}
return null;
}