Java,搜索文件夹以匹配名称

时间:2010-04-05 22:24:21

标签: java

我正在使用Java搜索与特定案例匹配的文件或文件夹。例如,我想搜索所有文件和文件夹,并根据需要多次迭代它们,直到找到结果。

捕获

我正在通过文件系统的二进制映像搜索文件和文件夹。这意味着我怀疑有任何预先存在的类java.file.*为我做这件事。如果它有帮助,我可以告诉你,我可以很容易地区分文件和文件夹。 (文件夹标记为0x20)

我能想到的唯一方法是进行标准循环并多次迭代,但如果文件或文件夹是多个文件夹,这就限制了我。

所有输入都非常欢迎

修改

为了澄清,我正在使用二进制图像并搜索目录。

我认为“目录”一词可能会产生误导。给定0的初始值,我想检查一系列字节。如果在正确的位置我遇到0x20(目录标记),我需要跳转到二进制图像中的新位置并再次开始搜索。如果我再次遇到0x20,我需要跳起并重新开始;完成后我回到原点并继续搜索另一个0x20。我需要这样做,直到我在特定位置没有更多的0x20。

我可以使用 n 循环执行此操作,但这只会让我深入 n directorys。我想知道是否有人对如何做到这一点有任何想法,直到没有更多的目录标记。

不确定这是否澄清了事情,但我希望如此。


EDIT 这是我正在使用的代码,我得到了堆栈溢出错误。关于如何改进它的任何想法?

  public boolean isDirectory(int dirAttr)
{
    if (dirAttr == dir.ATTR_DIRECTORY)
        return true;
    else return false;
}
public void searchDirectory(int clusterNum, String name)
{
    for (int i = 0; i<32;i++)
    {
        if(dir.DIR_NameS(clusterNum, i).contains(name))
        {
            System.out.println("Found a Match");
            System.out.println("File name = " + dir.DIR_NameS(clusterNum, i));
            System.out.println("File size in bytes = "+dir.DIR_FileSize(clusterNum, i));
            System.out.println("File starting cluster = "+dir.DIR_FstClusLO(clusterNum, i));
            System.out.println();
        }
        if(this.isDirectory(dir.DIR_Attr(clusterNum, i)))
        {
            searchDirectory(dir.DIR_FstClusLO(clusterNum, i), name);
        }
    }
}

4 个答案:

答案 0 :(得分:1)

您如何与此图片交互?它只是一个简单的字节数组?

在这种情况下,如果没有实现能够解析FAT16结构的东西(或者找到与保存为文件的文件系统的接口的api),你就无法在Java中完成它,所以你应该去here并且学习文件分配表的结构..

答案 1 :(得分:1)

  

我可以使用n循环但这样做   只会带我深入的导演。   我想知道是否有人有任何想法   关于如何做到这一点,直到没有   更多目录标记。

这种事情是通过使用递归或堆栈来完成的(在更深层次上,这些是等价的)。

对于递归解决方案,您将拥有一个查看文件夹的方法,并在发现子文件夹时自行调用。该列表可以是传递给方法的参数,附加结果。

对于基于堆栈的解决方案,您可以创建需要搜索的目录的堆栈(或列表)。它以根目录作为唯一内容开始。然后,当堆栈非空时,从中删除一个目录,搜索该目录并将所有子目录添加到堆栈,并将所有匹配的文件添加到结果列表中。重复直到堆栈为空。

答案 2 :(得分:0)

FileUtils.listFiles(rootDir, null, true)(来自commons-io)将为您提供给定根目录中的所有文件。

然后,您可以迭代返回的集合,以查看其中的File是否符合您的条件。

注意:这是与平台无关的。 true参数表示所有文件都是递归获取的。

答案 3 :(得分:0)

  

我能想到的唯一方法是做一个标准的循环并迭代几次,但这限制了我,如果一个文件或文件夹是几个文件夹深[...]我可以使用n循环这样做,但这只会带我深入了解导演。我想知道是否有人对如何做到这一点有任何想法,直到没有更多的目录标记。

听起来你在使用递归部分而不是IO部分时遇到了麻烦。以下是适合您的算法大纲:

public class RecurseDirectories {
    static String image =
      ";@root=<f1,f2,@d1,@d2,@foo>;@d1=<x,@d1d1>;@d2=<y>;@d1d1=<a,b>;@bar=<>;";

    String getContent(String dir, String image) {
        return image.replaceAll(
            "^.*;dir=<(.*?)>.*$|.*".replace("dir", dir),
            "$1"
        );
    }
    String[] iterable(String content) {
        return content.split(",");
    }
    boolean isDirectory(String file) {
        return file.startsWith("@");
    }

    void recurse(String image, String path, String dir) {
        String dirContent = getContent(dir, image);
        System.out.format("%s%s=<%s>%n", path, dir, dirContent);
        for (String file : iterable(dirContent)) {
            if (isDirectory(file)) {
                recurse(image, path + dir, file);
            }
            // do any checking of file here
        }
    }
    public static void main(String[] args) {
        new RecurseDirectories().recurse(image, "", "@root");
    }
}

打印出来:

@root=<f1,f2,@d1,@d2,@foo>
@root@d1=<x,@d1d1>
@root@d1@d1d1=<a,b>
@root@d2=<y>
@root@foo=<>

getContentisDirectory以及图片字符串的格式特定于此示例,但recurse基本上是您要学习的内容。它是depth-first search的一种形式。

确保目录树结构中没有自包含(可能由于符号链接等),因为这会导致无限递归(直到它导致StackOverflowError)。

另外,如果你想避免在整个搜索过程中多次浏览图像,你可以通过它一次构建一个树,然后通过那棵树recurse(即基本上getContent是你想要优化什么。)