使用Java程序删除文件或者目录

时间:2020-01-09 10:35:26  来源:igfitidea点击:

这篇文章显示了如何使用Java程序删除文件或者目录,以及如何在Java中递归删除目录。为了删除文件或者目录,Java提供了以下选项。

  • delete()–可以使用java.io.File类的delete方法。此方法删除此抽象路径名表示的文件或者目录。如果要删除目录,则该目录必须为空才能删除。如果文件或者目录已成功删除,则方法返回true,否则返回false。
  • Files.delete(路径路径)-从Java 7开始,Files.delete()方法可用于删除文件或者目录。要删除目录,必须确保该目录为空。如果该文件不存在,则此方法引发NoSuchFileException;如果该文件是目录,并且由于该目录不为空而无法删除,则抛出DirectoryNotEmptyException。
  • Files.deleteIfExists(路径)– Files类中用于删除文件或者目录的另一个选项是使用deleteIfExists()方法。如果存在文件或者文件夹,则此方法删除;如果通过该方法删除文件,则返回true。如果该文件不存在而无法删除,则返回false。对目录的相同限制适用于该目录必须为空。

在帖子中,我们将看到使用上述方法删除文件和目录的Java示例。我们还将看到如何通过递归删除文件和子目录并最终删除父目录来删除非空目录。

使用java.io.File删除方法删除文件

在示例代码中,涵盖了所有场景

  • 给定路径中存在的文件将被删除。

  • 尝试删除不存在的文件。

  • 删除一个空目录。

  • 尝试删除非空目录。

public class DeleteFile {
  public static void main(String[] args) {
    File file = new File("F:\theitroad\Test\postend.txt");
    fileDelete(file);

    // trying to delete file that doesn't exist
    file = new File("F:\theitroad\Test\postend.txt");
    fileDelete(file);

    // Deleting empty directory
    file = new File("F:\theitroad\Test");
    fileDelete(file);

    // Deleting non-empty directory
    file = new File("F:\theitroad\Parent");
    fileDelete(file);
  }
	
  private static void fileDelete(File file){
    if(file.delete()){
      System.out.println("File " + file.getName() + " deleted successfully");
    }else{
      System.out.println("File " + file.getName() + " not deleted as it doesn't exist/non-empty directory");
    }
  }
}

输出:

File postend.txt deleted successfully
File postend.txt not deleted as it doesn't exist/non-empty directory
File Test deleted successfully
File Parent not deleted as it doesn't exist/non-empty directory

使用文件delete和deleteIfExists方法删除文件

Files.delete方法删除文件

import java.io.IOException;
import java.nio.file.DirectoryNotEmptyException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Paths;

public class DeleteFile {
  public static void main(String[] args) {
    try {
      Files.delete(Paths.get("F:\theitroad\Test\postend.txt"));
      // deleting same file again - file that doesn't exist scenario
      Files.delete(Paths.get("F:\theitroad\Test\postend.txt"));
    } catch (NoSuchFileException e) {	
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    catch (DirectoryNotEmptyException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

输出:

java.nio.file.NoSuchFileException: F:\theitroad\Test\postend.txt
	at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79)
	at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
	at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
	at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:269)
	at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
	at java.nio.file.Files.delete(Files.java:1126)
	at com.theitroad.programs.DeleteFile.main(DeleteFile.java:16)

Files.deleteIfExists方法删除文件

public class DeleteFile {

  public static void main(String[] args) {
    try {
      if(Files.deleteIfExists(Paths.get("F:\theitroad\Test\postend.txt")))
        System.out.println("File deleted successfully");
      else
        System.out.println("File not deleted");
      // deleting same file again - file that doesn't exist scenario
      if(Files.deleteIfExists(Paths.get("F:\theitroad\Test\postend.txt")))
        System.out.println("File deleted successfully");
      else
        System.out.println("File not deleted");
    }
    catch (DirectoryNotEmptyException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

输出:

File deleted successfully
File not deleted

Files.delete方法来删除Java中的文件夹

public class DeleteFile {
  public static void main(String[] args) {
    try {      
      // Deleting empty directory
      Files.delete(Paths.get("F:\theitroad\Test"));
      
      // Deleting non-empty directory
      Files.delete(Paths.get("F:\theitroad\Parent"));
      
    } catch (NoSuchFileException e) {	
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    catch (DirectoryNotEmptyException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
}

输出:

java.nio.file.DirectoryNotEmptyException: F:\theitroad\Parent
	at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:266)
	at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
	at java.nio.file.Files.delete(Files.java:1126)
	at com.theitroad.programs.DeleteFile.main(DeleteFile.java:22)

在Java中以递归方式删除非空目录

从上面的示例中可以看到,目录应为空才能删除,如果目录为非空目录,则不删除。要删除非空目录,我们需要递归遍历文件夹结构并删除所有文件和子目录,然后再删除当前为空的父目录。

要递归删除Java中的文件,有两个选项-

  • 使用File.listFiles()方法返回代表目录中文件的抽象路径名数组。然后,我们可以迭代数组以删除文件,并且我们将必须递归地调用方法以在子目录中删除文件。

  • 从Java 7开始,我们可以使用Files.walkFileTree方法,该方法遍历以给定起始文件为根的文件树。

使用的目录结构

此处显示的删除Java中非空目录的Java程序使用以下目录结构。

在父文件夹中的带有两个子文件夹子文件夹子,其中有两个文件,而空文件夹中则没有文件。一个文件存储在父文件夹中。

使用File.listFiles()方法递归删除目录

public class DeleteDirectory {
  public static void main(String[] args) {
    // Source folder
    final String SOURCE_DIR = "F:/theitroad/Parent";
    File sourceDir = new File(SOURCE_DIR);
    directoryDeletion(sourceDir);
  }
	
  private static void directoryDeletion(File sourceDir){
    if(!sourceDir.isDirectory()){
      System.out.println("Not a directory.");
      return;
    }
    File[] fileList = sourceDir.listFiles();
    for(File file : fileList){
      // if directory call method recursively to 
      // list files with in sub-directories for deletion
      if(file.isDirectory()){
        System.out.println("Sub Directory- " + file.getName());
        directoryDeletion(file);
      }else{				 
        System.out.println("Deleting file- " + file.getName());
        // if it is a file then delete it
        file.delete();
      }
    }
    // For deleting sub-directories and parent directory
    System.out.println("Deleting Directory - " + sourceDir.getName());
    sourceDir.delete();
  }
}

输出:

Sub Directory- Child
Deleting file- hello.txt
Deleting file- Project.docx
Deleting Directory - Child
Sub Directory- Empty
Deleting Directory - Empty
Deleting file- Test.txt
Deleting Directory – Parent

使用Java Files.walkFileTree方法递归删除目录

从Java 7开始,可以使用Files.walkFileTree()方法,使用该方法可以遍历源目录的树结构并删除进程中的所有文件和子目录。此方法的参数之一是FileVisitor接口。我们确实需要根据需要提供此接口的实现。

FileVisitor接口有四个方法,要递归删除目录,我们确实需要实现其中两个。 postVisitDirectory(用于在访问所有文件后删除目录)和visitFile(用于删除文件)。

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

public class DeleteDirectory {
  public static void main(String[] args) {
    // Source folder
    final String SOURCE_PATH = "F:/theitroad/Parent";
    try {
      directoryDeletion(SOURCE_PATH);
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
  }
	
  private static void directoryDeletion(String sourceDir) throws IOException {
    Path sourcePath = Paths.get(sourceDir);
    Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>(){
      @Override
      // Before visiting the directory, create directory 
      public FileVisitResult postVisitDirectory(Path dir, IOException e) throws IOException {		    		
        System.out.println("Deleting Directory- " + dir.toString());
        Files.delete(dir);
        return FileVisitResult.CONTINUE;
      }
      @Override
      // For each visited file delete it
      public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException{
        System.out.println("Deleting file- " + file.getFileName());
        Files.delete(file);                
        return FileVisitResult.CONTINUE;
      }
    });  
  }
}

输出:

Deleting file- hello.txt
Deleting file- Project.docx
Deleting Directory- F:\theitroad\Parent\Child
Deleting Directory- F:\theitroad\Parent\Empty
Deleting file- Test.txt
Deleting Directory- F:\theitroad\Parent