日期:2014-05-20  浏览次数:20720 次

关于Java File Delete
首先有一个非空的文件夹(内包含子文件夹,子文件夹内包含文件)

我将文件夹内的子文件夹拷贝出来,代码如下:
Java code

public class DirCopy {
    private static final Logger logger = Logger.getLogger(DirCopy.class);
    public static boolean copy(String file1, String file2) {

        File in = new File(file1);
        File out = new File(file2);
        if (!in.exists()) {
            logger.error(in.getAbsolutePath() + "源文件路径错误!!!");
            return false;
        } else {
            logger.debug("源文件路径" + in.getAbsolutePath());
            logger.debug("目标路径" + out.getAbsolutePath());
        }
        if (!out.exists())
            out.mkdirs();
        File[] file = in.listFiles();
        FileInputStream fin = null;
        FileOutputStream fout = null;
        for (int i = 0; i < file.length; i++) {
            if (file[i].isFile()) {
                try {
                    fin = new FileInputStream(file[i]);
                } catch (FileNotFoundException e) {
                    logger.error("[execute()]catch:" + e.getMessage());
                }
                System.out.println("in.name=" + file[i].getName());
                try {
                    fout = new FileOutputStream(new File(file2 + AppConfig.get("jr.dir.FileSeparator")
                            + file[i].getName()));
                } catch (FileNotFoundException e) {
                    logger.error("[execute()]catch:" + e.getMessage());
                }
                //System.out.println(file2);
                int c;
                byte[] b = new byte[1024 * 5];
                try {
                    while ((c = fin.read(b)) != -1) {

                        fout.write(b, 0, c);
                        System.out.println("复制文件中!");
                    }
                    fin.close();
                    fout.flush();
                    fout.close();
                } catch (IOException e) {
                    logger.error("[execute()]catch:" + e.getMessage());
                }
            } else
                copy(file1 + AppConfig.get("jr.dir.FileSeparator") + file[i].getName(), file2 + AppConfig.get("jr.dir.FileSeparator")
                        + file[i].getName());
        }

        return true;

    }




然后删除该文件夹,代码如下:
Java code

public static void deleteDir(File dir) { 
        if (dir == null || !dir.exists() || !dir.isDirectory()) 
            return; // 检查参数 
        for (File file : dir.listFiles()) { 
            if (file.isFile()) 
                file.delete(); // 删除所有文件 
            else if (file.isDirectory()) 
                deleteDir(file); // 递规的方式删除文件夹 
        } 
        dir.delete();// 删除目录本身 
    }




问题是:删除文件夹时,发现只能删除文件夹中的第一个子文件夹。IO流我查了,发现已经关闭了,用了Unlocker发现文件被占用。后来我改用while(!file.delete)发现文件是可以被删除的,但是要等好久,请大侠解释以上问题


------解决方案--------------------
从删除文件的代码上,没发现什么逻辑错误,有异常吗?
------解决方案--------------------
代码我感觉无问题,我自己也测试了下删除正常着哩,楼主是不是有窗口打开了要删除的某个目录?
------解决方案--------------------
dir.listFiles()
你是一遍列出来一边删除吧,感觉你的删除可能会多listFiles()结果有影响,可以尝试先list目录到数组中,然后迭代数组进行删除
------解决方案--------------------
文件不能调用file.listFiles(),只有文件夹才行。。
Java code

        public static void main(String[] args)
    {
        deleteFile(new File("e:\\"));
    }
    
    public static void deleteFile(File file)
    {
        if(file.isFile())
        {
            file.delete();
        }
        else
        {
            File[] files = file.listFiles();
            for(File itemFile:files)
            {
                deleteFile(itemFile);
            }
            file.delete();
        }
    }