A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 蓝迪 初级黑马   /  2012-8-29 11:24  /  3056 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 蓝迪 于 2012-8-29 14:56 编辑
  1. /*
  2. 用递归算法扫描文件夹里的可执行文件
  3. 然后用Runtim方法执行它
  4. */
  5. import java.io.*;

  6. class FileText
  7. {
  8. public static void main(String[] args) throws Exception
  9. {
  10. File f = new File("g:\\xuexi\\java1\\day20");//扫描day20文件夹
  11. method(f);
  12. }
  13. public static void method(File dir)throws Exception
  14. {

  15. File[] files = dir.listFiles();//创建数组接收返回的文件对象
  16. for (int x=0; x<files.length ; x++)
  17. {
  18. if (files[x].isDirectory())//如果返回的是文件夹,则继续递归
  19. method(files[x]);
  20. else
  21. if (files[x].canExecute())//如果返回的是文件,则判断文件是否可执行
  22. {
  23. String s = files[x].getName();//接收可执行文件的文件名
  24. System.out.println("s=="+s);
  25. Runtime r = Runtime.getRuntime();
  26. Process p = r.exec(s);
  27. Thread.sleep(4000);//让进程休息4秒
  28. p.destroy();//杀掉子进程
  29. }
  30. else
  31. System.out.println(files[x]);
  32. }
  33. }
  34. }
复制代码
看了毕老师的视频,然后自己做了这个练习
需求是:扫描指定文件夹里的文件,如果是文件夹则继续递归
如果是文件,则判断文件是否可执行
若可执行,则用Runtime类执行

我编译成功了,但是运行中间出现问题,到底是什么原因,我的思路和代码有问题吗

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

5 个回复

正序浏览
周兴华 发表于 2012-8-29 14:08
我的想法是要写个方法,根据文件的后缀名来选择改用哪个执行软件来打开文件,但这样写的话如果碰到一个后 ...

楼主可以讲r.exec(sb);里的变量sb先定义成StringBuilder类型的对象,然后调用append方法即可将文件名添加进去。在毕老师的视频里有关于String类型很详细的讲解,楼主可参考下。
回复 使用道具 举报
周兴华 发表于 2012-8-29 12:20
  • if (files[x].canExecute())   //如果返回的是文件,则判断文件是否可执行,假设当前的文件为“D:\\1.tx ...

  • 我的想法是要写个方法,根据文件的后缀名来选择改用哪个执行软件来打开文件,但这样写的话如果碰到一个后缀名不知道改用哪个软件去打开它时就得将异常抛出。以上是我自己的想法,应该有更好的做法吧。
    回复 使用道具 举报

    • if (files[x].canExecute())   //如果返回的是文件,则判断文件是否可执行,假设当前的文件为“D:\\1.txt”,此时返回的是true
    • {
    • String s = files[x].getName();    //接收可执行文件的文件名,这里s为"D:\\1.txt"
    • System.out.println("s=="+s);
    • Runtime r = Runtime.getRuntime();
    • Process p = r.exec(s); //这句话就变成Process p = r.exec("D:\\1.txt");  这句话无法完成编译
                                             //以文本文件为例,要能够打开文本文件应当执行Process p = r.exec("notepad D:\\1.txt");
                                                    //因为notepad才是记事本的执行软件,要通过notepad来打开 "D:\\1.txt"文件。
    • Thread.sleep(4000);//让进程休息4秒
    • p.destroy();//杀掉子进程
    • }
    以上是以文本文件为例来说明的,下面是我自己写的验证代码,楼主可以试试看
    import java.io.*;
    public class RuntimeDemo {
    public static void main(String[] args) throws Exception{
      Runtime r=Runtime.getRuntime();
      Process p=r.exec("notepad D:\\IOTest\\1.txt");
      Thread.sleep(3000);
      p.destroy();
      
      File f=new File("D:\\IOTest\\1.txt");
      System.out.println(f.canExecute());
    }
    }

    回复 使用道具 举报
    本帖最后由 唐志兵 于 2012-8-29 12:06 编辑

    需要打印文件层次的话可以用我的这种方法。至于那个runtime我就不写了。不然一个目录中有几百个exe文件,那一运行就悲剧了。。下面是输出结果图片。
    1. import java.io.File;

    2. /**

    3. /**
    4. * @author Administrator
    5. *
    6. */
    7. public class filePrint {
    8. public static int num = 1;

    9. public static void main(String[] args) {
    10. File file = new File("D:\\驱动精灵");
    11. System.out.println(file.getPath());
    12. enumFile(file);
    13. }

    14. public static void enumFile(File file){
    15. File[] list = file.listFiles();
    16. for (int i = 0; i < list.length; i++) {
    17. printTab(num);
    18. if (list[i].isDirectory()) {
    19. System.out.println("文件夹:" + list[i].getName() + "\\");
    20. num++;
    21. enumFile(list[i]);
    22. num--;
    23. }else
    24. System.out.println(list[i].getName());
    25. }
    26. }

    27. public static void printTab(int num){
    28. for (int i = 0; i < num; i++) {
    29. System.out.print("\t");
    30. }
    31. }
    32. }
    复制代码

    评分

    参与人数 1技术分 +1 收起 理由
    包晗 + 1

    查看全部评分

    回复 使用道具 举报
    本帖最后由 蓝迪 于 2012-8-29 13:07 编辑

    怎么把扫描到的文件都运行一次, .txt .exe .java 不管类型,怎么修改那代码?
    回复 使用道具 举报
    您需要登录后才可以回帖 登录 | 加入黑马