我想写一个程序,用户输入一个文件名。让这个java 程序把在MY COMPUTER里所有的和这个文件名匹配的文件都放到一个txt文件里。文件的每一行都是一个完整的路径!我现在是这用 exec("dir /s" + 文件名)。 格式dir得到的格式,和我需要的差距太大了。 
请大家指点一下!

解决方案 »

  1.   

    File.getAbsolutPath获取文件的绝对路径...厄..我应该没拼错吧..呵呵
      

  2.   

    这个需求不是这么简单就可以搞定的.
    首先需要遍历所有盘符下的所有文件,而且你的匹配是什么匹配? 只是相等或是*.等通配符? 
    找到文件件后保存文件的.getPath()方法就可保存完整路径.你实现的应该是一个文件查找的程序. 不是很简单.
      

  3.   


    import java.io.*;
    import java.util.*;
    public class Find
    {
    static Vector<String> files = new Vector<String>();

    private static boolean compareFileName(String name1,String name2)
    {
    if (name1.equalsIgnoreCase(name2))
    {
    return true;
    }
    return false;
    }

    private static void findFile(File root,String fileName)
    {
    File[] childFiles = root.listFiles();
    if (childFiles == null)
    {
    return;
    }
    for (int j = 0; j < childFiles.length; j++)
    {
    if (!childFiles[j].canRead())
    {
    continue;
    }
    if (childFiles[j].isFile())
    {
    if (compareFileName(childFiles[j].getName(),fileName))
    {
    files.add(childFiles[j].getPath());
    }
    }
    else
    {
    findFile(childFiles[j],fileName);
    }
    }
    }
    public static void findFile(String fileName) throws Exception
    {
    File[] roots = File.listRoots();
    for (int i = 0; i < roots.length; i++)
    {
    findFile(roots[i],fileName);
    }
    writeFile();
    }

    private static void writeFile() throws Exception
    {
    FileWriter writer = new FileWriter("result.txt");
    for (String name : files)
    {
    writer.write(name + "\n");
    }
    writer.close();
    }

    public static void main(String[] args) throws Exception
    {
    findFile(args[0]);
    }
    }
      

  4.   

    再把compareFileName方法改进下,就可实现各种匹配
      

  5.   

    闲的没事,再来个完整点的.public class CompareUtil
    {
    public static boolean compareFileName(String name1,String name2)
    {
    // file.txt *i*.*
    if (name1.equalsIgnoreCase(name2))
    {
    return true;
    }
    return false;
    }
    }import java.util.Vector;
    import java.io.File;public class Finder extends Thread
    {
    Vector<String> result = new Vector<String>();
    boolean running = true;
    File file;
    String fileName;

    public Finder(File f,String name)
    {
    file = f;
    fileName = name;
    System.out.println("Thread : " + getName() + " is Finding " + f.getPath());
    }

    public void handleFile(File file,String fileName)
    {
    if (CompareUtil.compareFileName(file.getName(),fileName))
    {
    result.add(file.getPath());
    }
    }

    private void findFile(File file,String fileName)
    {
    if (!file.canRead())
    {
    return;
    }
    if (file.isFile())
    {
    handleFile(file,fileName);
    return;
    }
    //System.out.println("Folder : " + file.getPath() + " ... ");
    File[] childFiles = file.listFiles();
    if (childFiles == null)
    {
    return;
    }
    for (int j = 0; j < childFiles.length; j++)
    {
    findFile(childFiles[j],fileName);
    }
    }

    public boolean isRunning()
    {
    return running;
    }

    public Vector<String> getResult()
    {
    return result;
    }

    public void run()
    {
    findFile(file,fileName);
    running = false;
    System.out.println("Thread : " + getName() + " Over. ");
    }
    }
    import java.io.*;
    import java.util.*;
    public class Find
    {
    static String resultFileName = "result.txt";
    static Vector<String> files = new Vector<String>();
    static Vector<Finder> finders = new Vector<Finder>();

    public static void handleFile(File file,String fileName)
    {
    if (CompareUtil.compareFileName(file.getName(),fileName))
    {
    files.add(file.getPath());
    }
    }

    public static void findFile(String path,String fileName) throws Exception
    {
    if (path == null)
    {
    File[] roots = File.listRoots();
    for (int i = 0; i < roots.length; i++)
    {
    File[] rootFiles = roots[i].listFiles();
    if (rootFiles == null)
    {
    continue;
    }
    for (int j = 0; j < rootFiles.length; j++)
    {
    if (rootFiles[j].isFile())
    {
    handleFile(rootFiles[j],fileName);
    }
    else
    {
    File[] childFiles = rootFiles[j].listFiles();
    if (childFiles != null)
    {
    for (int x = 0; x < childFiles.length; x++)
    {
    if (childFiles[x].isFile())
    {
    handleFile(childFiles[x],fileName);
    }
    else
    {
    Finder finder = new Finder(childFiles[x],fileName);
    finders.add(finder);
    finder.start();
    }
    }
    }
    }
    }
    }
    }
    else
    {
    File folder = new File(path);
    if (folder.isFile())
    {
    handleFile(folder,fileName);
    }
    else
    {
    File [] allFiles = folder.listFiles();
    for (int i = 0; i < allFiles.length; i++)
    {
    Finder finder = new Finder(allFiles[i],fileName);
    finders.add(finder);
    finder.start();
    }
    }
    }

    while (true)
    {
    boolean allOver = true;
    for (Finder finder : finders)
    {
    if (finder.isRunning())
    {
    allOver = false;
    break;
    }
    }

    if (allOver)
    {
    for (Finder finder : finders)
    {
    files.addAll(finder.getResult());
    }
    break;
    }
    else
    {
    Thread.sleep(100);
    }
    }

    System.out.println("\n");
    if (files.size() > 0)
    {
    System.out.println("Find File : ");
    FileWriter writer = new FileWriter(resultFileName);
    for (String name : files)
    {
    System.out.println(name);
    writer.write(name + "\n");
    }
    writer.close();
    }
    else
    {
    System.out.println("File with name [" + fileName + "] Not Found. ");
    }
    }

    public static void main(String[] args) throws Exception
    {
    String path = null;
    String name = null;
    if (args.length > 1)
    {
    path = args[0];
    name = args[1];
    }
    else if (args.length == 1)
    {
    name = args[0];
    }
    else if (args.length == 0)
    {
    System.out.println("usage : java Find [path] filename");
    return;
    }
    findFile(path,name);
    }
    }
      

  6.   


    查下API,File 可以取出文件的完整路径的。然后用递归,遍历MY COMPUTER
      

  7.   

    这是要匹配整个系统的文件
    是个遍历文件夹的问题
    用递归方法
    if是文件夹,递归
    else是文件,进行比较
      

  8.   

    pauliuyou, 倒是更欣赏你第一个代码,简单明了,风格不错,第二个方法太长,应该重构:)
      

  9.   

    我是一个JAVA初学者,以后多来向你们学习
      

  10.   

    我是一个JAVA初学者,以后多来向你们学习
      

  11.   

    代码认真研究中,因为的多线程,需要时间去消化。我还天真的以为 java运行 dir /s 文件名,得到文件目录文件,然后处理那个文件目录哪!谢谢
      

  12.   

    这哪是个简单的查找文件问题呀。简直就是java高级考试题了。 多线程, recursion 都用上了。研究了好一阵子才知道大概是怎么用的了!  觉得写这个程序的人一定是一等一的高人!十分感谢。要是我这么也写不出来这样好的程序来!
      

  13.   

    有两个地方还是没理解,请大家指教:哪个 continue;结束以后,程序接着从那里开始?
    还有就是
     for (String name : files)
                {
                    System.out.println(name);
                    writer.write(name + "\n");
                }
    (String name : files) 这个条件是什么意思?? 
      

  14.   

    也发一个简单点的
    public class MyComp { public static void findFileFromDir(File dir, String fileName,
    OutputStream txt) {
    if (!dir.isDirectory()) {
    return;
    }
    File[] files = dir.listFiles();
    if (files == null || files.length == 0) {
    return;
    }
    for (int i = 0; i < files.length; i++) {
    if (files[i].isDirectory()) {
    findFileFromDir(files[i], fileName, txt);
    } else if (files[i].isFile()) {
    String path = files[i].getAbsolutePath();
    if (path.endsWith(fileName)) {
    try {
    txt.write(path.getBytes());
    txt.flush();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    } } public static void main(String[] args) throws IOException {
    String fileName = "\\" + args[0];
    OutputStream out = new BufferedOutputStream(new FileOutputStream(
    args[1])); File[] dev = File.listRoots();
    for (int i = 0; i < dev.length; i++) {
    findFileFromDir(dev[i], fileName, out);
    }
    }}
      

  15.   

    上面例子中应该加写地址的时候应该
    ……
    txt.write((path+"\n").getBytes());
    ……
      

  16.   

    jdk1.5的新特性表示 便利files中的每一个原素...每个元素的名字都为name  而String 是每个元素的类型
      

  17.   


    import java.io.File;public class MainFile
    {
    public static void main(String args[])
    {


    String fname="read.txt";//要查找的文件名

    File[] file=File.listRoots();

    System.out.println("begin...");

    for(File f:file)
    {
    System.out.println("Search  "+f.getAbsolutePath());
    search(f,fname);
    }

    System.out.println("end...");

    }
    public static void search(File f,String fname)
    {
    if(f.isFile())
    {
    if(fileNameEquals(f.getName(),fname))
    {
    System.out.println(f.getAbsolutePath());
    }

    return;
    }

    if(f.isDirectory())
    {
    File [] dfile=f.listFiles();
    for(File df:dfile)
    {
    if(df.isFile())
    search(df,fname);
    }
    for(File df:dfile)
    {
    if(df.isDirectory())
    search(df,fname);
    }
    }

    }
    public static boolean fileNameEquals(String fname,String sname)
    {
    if(fname.equals(sname))
    return true;

    return false;
    }
    }
      

  18.   

    修改下...f.lisetFiles()
    之后..忘记判断下返回是否为null了...