java - 递归删除目录时的延迟

标签 java windows groovy directory

我有以下 Groovy 测试脚本:

def dir = new File("test")
dir.mkdirs()

char[] data = new char[100]
Arrays.fill(data, (char)'q')

for(i in 0..1760){
    def file = new File(dir, "file$i")
    file.createNewFile()

    file.withOutputStream { os ->
        os << data  
    }
}

def delete (File f){
    if(f.isDirectory()){
        for(File afile : f.listFiles()){
            delete(afile);
        }
        f.delete();
    }else{
        f.delete();
    }
}

delete(dir)

dir.mkdirs()

new File(dir, "file").createNewFile() //<-- java.io.IOException: Access is denied

失败的原因是:

Caught: java.io.IOException: Access is denied
java.io.IOException: Access is denied
    at java_io_File$createNewFile.call(Unknown Source)
    at test.run(test.groovy:29)

但是,如果我将测试脚本修改为如下所示:

def dir = new File("test")
dir.mkdirs()

char[] data = new char[100]
Arrays.fill(data, (char)'q')

for(i in 0..1760){
    def file = new File(dir, "file$i")
    file.createNewFile()

    file.withOutputStream { os ->
        os << data  
    }
}

def delete (File f){
    if(f.isDirectory()){
        for(File afile : f.listFiles()){
            delete(afile);
        }
        f.delete();
    }else{
        f.delete();
    }
}

delete(dir)

Thread.sleep(1000) // <---- added a 1 second pause after deleting

dir.mkdirs()

new File(dir, "file").createNewFile() // <-- No Exception

它不会再失败。我在 Windows 7 64 位上运行 Java 6。有人知道延迟从何而来或如何解释吗?

编辑:

同样的错误发生在 Java 6 中,这就是为什么我将其标记为 Java(Groovy 更容易编写示例)。下面是在 Java 中同样失败的等效测试:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;


public class Test {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        new Test().execute();
    }

    public void execute() throws IOException{
        File dir = new File("test");
        dir.mkdirs();

        char[] data = new char[100];
        Arrays.fill(data, (char)'q');

        for(int x = 0; x < 1760; x++){
            File file = new File(dir, "file" + x);
            file.createNewFile();

            FileWriter fw = null;
            try{
                fw = new FileWriter(file);
                fw.write(data);
            }finally{
                if(fw != null){
                    fw.close();
                }
            }
        }

        delete(dir);

        dir.mkdirs();

        new File(dir, "file").createNewFile(); //<-- java.io.IOException: Access is denied
    }

    private void delete (File f){
        if(f.isDirectory()){
            for(File afile : f.listFiles()){
                delete(afile);
            }
            f.delete();
        }else{
            f.delete();
        }
    }

}

最佳答案

这似乎已经成功了:

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;


public class Test {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        new Test().execute();
    }

    public void execute() throws IOException{
        File dir = new File("test");
        dir.mkdirs();

        char[] data = new char[100];
        Arrays.fill(data, (char)'q');

        for(int x = 0; x < 1760; x++){
            File file = new File(dir, "file" + x);
            file.createNewFile();

            FileWriter fw = null;
            try{
                fw = new FileWriter(file);
                fw.write(data);
            }finally{
                if(fw != null){
                    fw.close();
                }
            }
        }

        delete(dir);

        //dir.mkdirs(); <-- commented out
        while(!dir.mkdirs()); //<-- dir.mkdirs() will return false until the directory has been successfully re-created

        new File(dir, "file").createNewFile();
    }

    private void delete (File f){
        if(f.isDirectory()){
            for(File afile : f.listFiles()){
                delete(afile);
            }
            f.delete();
        }else{
            f.delete();
        }
    }

}

仍然不确定删除文件夹时的延迟到底来自哪里,但我假设这只是文件系统的一个怪癖。

关于java - 递归删除目录时的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14656021/

相关文章:

ruby - Visual TCL,如何安装和使用?

java - 控制台窗口,类似于Windows "cmd.exe"

windows - 使用 Qt 4 与 Qt 5 开发适用于 Windows 和 OS X 的应用程序?

maven - 使用 gmaven 在 maven 中设置属性

java 使用逻辑运算符代替 if-else if 进行返回

java - 当绑定(bind)的客户端断开连接时通知 Android 服务

java - 在 groovy 中读取 Excel 文件的最简单方法?

kotlin - 如何在 Kotlin 中重写 text.source 目录?

java - 如何自定义 Optional 类中 NoSuchElementException 的错误信息

java - 更改一笔交易中的实体字段