Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,搜索文件夹以匹配名称_Java - Fatal编程技术网

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

Java,搜索文件夹以匹配名称,java,Java,我使用Java搜索与特定案例匹配的文件或文件夹。例如,我想搜索所有文件和文件夹,并根据需要多次迭代,直到找到结果 陷阱 我正在通过文件系统的二进制图像搜索文件和文件夹。这意味着我怀疑是否有任何预先存在的类,比如java.file.*来为我做这件事。如果有帮助,我可以告诉你,我可以很容易地分辨出文件和文件夹之间的区别。(文件夹标记为0x20) 我能想到的唯一方法是做一个标准循环并迭代几次,但如果一个文件或文件夹有几个文件夹那么深,这就限制了我 欢迎各界人士踊跃参与 编辑 为了澄清一下,我使用了一个

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

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

我能想到的唯一方法是做一个标准循环并迭代几次,但如果一个文件或文件夹有几个文件夹那么深,这就限制了我

欢迎各界人士踊跃参与

编辑 为了澄清一下,我使用了一个二进制图像,并在其中搜索目录

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

我可以使用n个循环来实现这一点,但这只会占用我n个目录的深度。我想知道,在没有更多的目录标记之前,是否有人对如何做到这一点有任何想法

我不确定这是否能澄清问题,但我希望能澄清


编辑 这是我正在使用的代码,我得到一个堆栈溢出错误。有什么办法可以改进吗

  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);
        }
    }
}
public boolean isDirectory(int dirAttr)
{
if(dirAttr==dir.ATTR\u目录)
返回true;
否则返回false;
}
public void searchDirectory(int-clusterNum,字符串名)
{
for(int i=0;i(from)将提供给定根目录中的所有文件

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


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

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

在这种情况下,如果不实现一些能够解析FAT16结构的东西(或者找到一个api与保存为文件的文件系统进行接口),您就无法在Java中实现它,因此您应该去学习文件分配表的结构

我能想到的唯一方法是做一个标准循环并迭代几次,但这限制了我,如果一个文件或文件夹有几个文件夹深[…]我可以使用n个循环来做这件事,但这只会让我有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=;@d1=;@d2=;@d1d1=

确保目录树结构中没有自包含(可能是由于符号链接等原因),因为这将导致无限递归(直到它导致
堆栈溢出错误

此外,如果您希望避免在整个搜索过程中多次浏览图像,您可以浏览图像一次以构建一个树,然后通过该树进行递归(即基本上
getContent
是您想要优化的)

我可以使用n个循环来完成这个,但是 只会把我带到目录的深处。 我想知道是否有人有什么想法 关于如何做到这一点,直到没有 更多目录标记

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

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


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

什么意思在二值图像中搜索"?什么是二进制图像?我正在处理一个我拍摄的FAT16拇指驱动器的图像,我想是的。这是卷的逐字节图像。使用-DDhmm拍摄。我不确定在我的情况下这是否有效。你知道源代码是否可用吗?但这不是apache吗?这里的Java教程将提供纯Java
http://java.sun.com/docs/books/tutorial/essential/io/find.html
源代码可用。我提供了一个指向commons io主页的链接,您可以从那里签出它。我正在阅读图像,没有问题,如果您和他们使用0xFF,这些字节没有问题。这就是我试图使用我的代码所做的。但我想我一定是做错了
@root=<f1,f2,@d1,@d2,@foo>
@root@d1=<x,@d1d1>
@root@d1@d1d1=<a,b>
@root@d2=<y>
@root@foo=<>