【问题标题】:Cannot delete folder using Java无法使用 Java 删除文件夹
【发布时间】:2014-03-31 21:31:48
【问题描述】:

我正在尝试删除一个只有文件但没有子文件夹的文件夹,但没有成功。

代码:

File rowFolder = new File(folderPath);
String[] files = rowFolder.list();
for (String file : files){
    File deleteFile = new File(file);
    System.out.println("deleting file -"+deleteFile.getName());
    deleteFile.delete();
}
System.out.println("deleting folder -"+rowFolder.getName());
rowFolder.delete();

输出:

deleting file -testing.pdf
deleting file -app_json.json
deleting file -photo.jpg
deleting folder -bundle_folder

代码不会删除任何文件夹或任何文件。这是为什么呢?

【问题讨论】:

  • 可以先查看delete()的返回值(boolean)看是否运行良好。也许你没有权利这样做。
  • delete 方法返回一个布尔值,请检查它的值...
  • 当我使用apache commons的FileUtils.deleteDirectory()时,文件夹被成功删除。这解决了问题。我一定会检查返回的布尔值,看看我在问题中显示的先前代码有什么问题

标签: java file file-io java-io


【解决方案1】:

您的删除失败可能有多种原因;该文件可能被文件系统锁定,您可能缺少权限,或者可能被其他进程打开等。

如果您使用的是 Java 7 或更高版本,则可以使用 javax.nio.* API;它比legacyjava.io.Fileclasses 更可靠和一致:

Path fp = file.toPath();
Files.delete(fp);

如果你想捕捉可能的异常:

try {
    Files.delete(path);
} catch (NoSuchFileException x) {
    System.err.format("%s: no such" + " file or directory%n", path);
} catch (DirectoryNotEmptyException x) {
    System.err.format("%s not empty%n", path);
} catch (IOException x) {
    // File permission problems are caught here.
    System.err.println(x);
}

查看docs 了解有关 Java 7 中 IO 的更多信息

【讨论】:

    【解决方案2】:

    试试这个。来源:How To Delete Directory In Java

    import java.io.File;
    import java.io.IOException;
    
    public class DeleteDirectoryExample
    {
        private static final String SRC_FOLDER = "C:\\mkyong-new";
    
        public static void main(String[] args)
        {   
    
            File directory = new File(SRC_FOLDER);
    
            //make sure directory exists
            if(!directory.exists()){
    
               System.out.println("Directory does not exist.");
               System.exit(0);
    
            }else{
    
               try{
    
                   delete(directory);
    
               }catch(IOException e){
                   e.printStackTrace();
                   System.exit(0);
               }
            }
    
            System.out.println("Done");
        }
    
        public static void delete(File file)
            throws IOException{
    
            if(file.isDirectory()){
    
                //directory is empty, then delete it
                if(file.list().length==0){
    
                   file.delete();
                   System.out.println("Directory is deleted : " 
                                                     + file.getAbsolutePath());
    
                }else{
    
                   //list all the directory contents
                   String files[] = file.list();
    
                   for (String temp : files) {
                      //construct the file structure
                      File fileDelete = new File(file, temp);
    
                      //recursive delete
                     delete(fileDelete);
                   }
    
                   //check the directory again, if empty then delete it
                   if(file.list().length==0){
                     file.delete();
                     System.out.println("Directory is deleted : " 
                                                      + file.getAbsolutePath());
                   }
                }
    
            }else{
                //if file, then delete it
                file.delete();
                System.out.println("File is deleted : " + file.getAbsolutePath());
            }
        }
    }
    

    【讨论】:

    • 一个非常糟糕的引用来源。由于此代码不检查任何错误,因此它完全能够不删除文件,并且在发生这种情况时会产生完全误导性的输出。
    【解决方案3】:

    由于您没有检查 delete() 的返回值,因此您产生的输出毫无意义。删除失败可能有多种原因:

    • 该文件是一个非空目录
    • 文件已被其他用户打开(在某些平台上)
    • 您无权删除该文件。

    【讨论】:

    • 当我使用apache commons的FileUtils.deleteDirectory()时,文件夹被成功删除。这解决了问题。我一定会检查返回的布尔值,看看我在问题中显示的先前代码有什么问题
    • 仅仅检查不会告诉你哪里出了问题,但它会告诉你哪里出了问题,以及在哪个文件或目录。然后你可以看看那个文件或目录。
    【解决方案4】:

    试试这个代码

     public class DeleteDirTest {
        public static void main(String[] args) throws IOException {
            DeleteDirTest test = new DeleteDirTest();
            boolean result = test.deleteDir(new File("D:/test"));
            System.out.println(result);         
        }
    
        public boolean deleteDir(File file) {
            if (file.isDirectory()) {
                String[] children = file.list();
                for (int i = 0; i < children.length; i++) {
                    boolean success = deleteDir(new File(file, children[i]));
                    if (!success) {
                        return false;
                    }
                }
            }
            return file.delete();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2020-06-09
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 2023-04-07
      相关资源
      最近更新 更多