递归查找目录下所有指定文件(包括深层目录)

huayuan_001 2008-04-03 01:55:07
递归查找目录下所有指定文件(包括深层目录)。
--文件指定的时候可以使用通配符。

或者说。遍历一个文件夹,查找指定的文件,(指定的文件是通过通配符来指定的)。

麻烦大家了
...全文
646 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
huayuan_001 2008-04-07
  • 打赏
  • 举报
回复
感谢两位兄弟。
问题已解决了。


这里解决通配符的问题。
class MyString {
private String myString;

public MyString(String myString) {
this.myString = myString;
}

public boolean isLike(String regex){
regex = Pattern.quote(regex);
regex = regex.replace("*", "\\E.*\\Q").replace("?", "\\E.\\Q");
return myString.matches(regex);
}
}

过滤器这样改写一下就好了
public class FileFilteres implements FilenameFilter {

private String key;

public FileFilteres(){
}

public FileFilteres(String key){
this.key = key;
}

public boolean accept(File dir, String name) {
// TODO Auto-generated method stub

File file = new File(dir.getAbsoluteFile() + "/" + name);
if(file.isDirectory()) {
return true;
}

return new MyString(name).isLike(key);
}
}


谢谢。

  • 打赏
  • 举报
回复
对于正则表达式,下面的帖子中有一些信息

http://topic.csdn.net/u/20080306/17/f37a1818-3968-49b4-8f79-e5564486d63e.html
  • 打赏
  • 举报
回复
通配符可以将其替换成正则表达式的形式,在下面的这个帖中有类似的

http://topic.csdn.net/u/20080317/19/228be473-2b40-4323-91c7-c6a7ac393cfd.html
  • 打赏
  • 举报
回复
所以grep t*.??p 的正则表达式的字符串形式就是 grep t.+\\.\\.p
写错了,是 grep t.+\\...p

哎。。。正则我也不是非常深,错了不要笑我
  • 打赏
  • 举报
回复
我知道通配符是什么,我是说用正则表达式来实现通配符,比如你输入 grep t*.??p

*表示任意字符出现1次或多次, 正则表达式表示任意字符出现0次获多次 是 .+

?表示任意字符出现1次,正则表达式就是 .

你的 . 正则表达式是 \. 由于要写成字符串,\的转义字符是\\

所以grep t*.??p 的正则表达式的字符串形式就是 grep t.+\\.\\.p

你要写个程序,把你要实现的通配符转换成正则表达式,我觉得这个不难吧
huayuan_001 2008-04-03
  • 打赏
  • 举报
回复
是啊,刚才研究了半天,没有弄明白。

但是应为最后是要让普通人用的
就好比 unix命令的: grep t*.??p
只需要通配符中的? 和 * 。 因为程序最后是要给别人用的,所以应该是其操作起来简单。
如果从main()参数传进来的话, 不能让用户输入正则表达式来查找啊。
不过我自己还是得闲学习学习正则表达式。我是一点都不懂。
huayuan_001 2008-04-03
  • 打赏
  • 举报
回复


像DOS,UNIX命令那样的 ? * 就可以了。
比如: ?.txt *.txt ?.* *.*

就要这样的。 不知道怎么实现。

帮帮
  • 打赏
  • 举报
回复
分数不是问题,讨论讨论,互相帮助

正则表达式

比如你要搜以 jar为后缀名的

那么所有符合条件的文件应该是以.jar结尾的

那么判断一个字符串是不是以.jar结尾,且.jar前面至少有一个字符的正则表达式:.+\\.jar


import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegxTest {
public static void main(String[] args){
Pattern p = Pattern.compile(".+\\.jar");
Matcher m = p.matcher("dfsdf.jar");
System.out.println(m.matches());
m = p.matcher(".jar");
System.out.println(m.matches());
m = p.matcher("dfsdf.ja");
System.out.println(m.matches());
m = p.matcher("dfsdf.");
System.out.println(m.matches());
m = p.matcher("dfsdfjar");
System.out.println(m.matches());
}
}


运行结果:
true
false
false
false
false

只有第一个符合要求。

那么可以把accept()方法改写成

@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub

File file = new File(dir.getAbsoluteFile()+"/"+name);

if(file.isDirectory()) return true; //如果是目录,不管有没有包含key,都返回true

Pattern p = Pattern.compile(key); //这里key是正则表达式了
Matcher m = p.matcher(name);

return m.matches();
}

这样就找到所有.jar文件

正则表达式博大精深,简简单单是不可能说清的,我也是一知半解,兄弟要研究还是要自己看看书啊
huayuan_001 2008-04-03
  • 打赏
  • 举报
回复

恩,我知道了。

谢谢。太有帮助了。了解了过滤器的用法。

辛苦了

现在就差通配符的问题了。 我对java一窍不通。

通配符我再查查。 要是可以的话,希望你能把通配符的问题也给讲讲。来个例子。 我真的是不行。

谢谢。 我就不发新的帖子了, 通配符可以的话,另外给加分。

除了这个 今天一天就弄明白了个对文件的操作。 跟c++区别真大。
胡矣 2008-04-03
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
上面这个代码是找F:盘下面的所有包含ruby字段的文件,大小写敏感。。。

我的运行结果是:
ruby.js
jruby.jar
jruby-aop.xml
jruby-with-xsd.xml
jrubyBrokenContext.xml
jrubyContext.xml
jrubyContextForPrimitives.xml
jrubyContextForWrappers.xml
jrubyRefreshableContext.xml
jruby.jar
jruby-aop.xml
jruby-with-xsd.xml
jrubyBrokenContext.xml
jrubyContext.xml
jrubyContextForPrimitives.xml
jrubyContextForWrappers.xml
jrubyRefreshableContext.xml
comparison-to-ruby-on-rails.html
rubyonrails.pdf
ruby186-25.exe
好了

不知道有没有更简单的方法了。。。期待高手讲解
  • 打赏
  • 举报
回复
不好意思,我前面看错了,我以为你要找的文件所在目录也要包含key。。。


/*****************过滤器*********************************/
import java.io.File;
import java.io.FilenameFilter;


public class FileFilter implements FilenameFilter {

private String key;

public FileFilter(){

}

public FileFilter(String key){
this.key = key;
}


@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub

File file = new File(dir.getAbsoluteFile()+"/"+name);

if(file.isDirectory()) return true; //如果是目录,不管有没有包含key,都返回true

return name.contains(key);
}
}

/****************************主类************************/
import java.io.File;

public class TestCode {

public static void main(String[] args) {
findFiles("F:", "ruby");
System.out.println("好了");
}

public static void findFiles(String filePath, String key) {
File file = new File(filePath);
if (file.isFile()) {
System.out.println(file.getName()); // 如果是个文件则返回
return;
}
// 否则是目录,继续遍历里面的文件
File[] files = file.listFiles(new FileFilter(key));
if (files != null) {
for (int i = 0; i < files.length; i++) {
findFiles(files[i].getAbsolutePath(), key);
}
}
}
}


上面这段代码是我找我F:盘中所有带“ruby”字的文件,你可以拷去,把搜索条件换一下,试试看。

如果你要搞通配符的,那么要重写
accept(...){....}
这段代码。

建议使用正则表达式,也就是说key是一个正则表达式,符合该正则表达式,则返回true.

不知道有没有帮助。听听高手的意见

huayuan_001 2008-04-03
  • 打赏
  • 举报
回复
这里添加一个实现FilenameFilter接口的类的实例,以关键字key,过滤文件名

2楼的大哥,遍历文件夹我也是没有问题。
就是过滤文件名,不会。

能不能给个例子阿? 还有关键字 key 想要使用通配符。

麻烦了。
zysmiracle 2008-04-03
  • 打赏
  • 举报
回复
2楼正解
  • 打赏
  • 举报
回复

public static void findFiles(String filePath,String key){
File file = new File(filePath);
if(file.isFile()){
System.out.println(file.getAbsolutePath()); //如果是个文件则返回
return ;
}
//否则是目录,继续遍历里面的文件
File[] files = file.listFiles(); //这里添加一个实现FilenameFilter接口的类的实例,以关键字key,过滤文件名
for(int i=0; i<files.length; i++){
findFiles(files[i].getAbsolutePath(),key);
}
}



至于怎么用FilenameFilter,自己查java文档。

吴冬冬 2008-04-03
  • 打赏
  • 举报
回复
给你提供8种搜索方式:
广度优先搜索
深度优先搜索
回溯搜索
代价一致搜索
深度优先搜索
迭代深入深度优先
迭代延长搜索
双向搜索

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧