我正在使用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);
}
}
}
答案 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=<>
getContent
,isDirectory
以及图片字符串的格式特定于此示例,但recurse
基本上是您要学习的内容。它是depth-first search的一种形式。
确保目录树结构中没有自包含(可能由于符号链接等),因为这会导致无限递归(直到它导致StackOverflowError
)。
另外,如果你想避免在整个搜索过程中多次浏览图像,你可以通过它一次构建一个树,然后通过那棵树recurse
(即基本上getContent
是你想要优化什么。)