1 /** 2 * Copyright (c) 2011-present, Facebook, Inc. All rights reserved. 3 * This source code is licensed under both the GPLv2 (found in the 4 * COPYING file in the root directory) and Apache 2.0 License 5 * (found in the LICENSE.Apache file in the root directory). 6 */ 7 package org.rocksdb.util; 8 9 import java.io.IOException; 10 import java.nio.file.FileVisitResult; 11 import java.nio.file.Files; 12 import java.nio.file.Path; 13 import java.nio.file.SimpleFileVisitor; 14 import java.nio.file.attribute.BasicFileAttributes; 15 16 public final class FileUtils { 17 private static final SimpleFileVisitor<Path> DELETE_DIR_VISITOR = new DeleteDirVisitor(); 18 19 /** 20 * Deletes a path from the filesystem 21 * 22 * If the path is a directory its contents 23 * will be recursively deleted before it itself 24 * is deleted. 25 * 26 * Note that removal of a directory is not an atomic-operation 27 * and so if an error occurs during removal, some of the directories 28 * descendants may have already been removed 29 * 30 * @param path the path to delete. 31 * 32 * @throws IOException if an error occurs whilst removing a file or directory 33 */ delete(final Path path)34 public static void delete(final Path path) throws IOException { 35 if (!Files.isDirectory(path)) { 36 Files.deleteIfExists(path); 37 } else { 38 Files.walkFileTree(path, DELETE_DIR_VISITOR); 39 } 40 } 41 42 private static class DeleteDirVisitor extends SimpleFileVisitor<Path> { 43 @Override visitFile(final Path file, final BasicFileAttributes attrs)44 public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException { 45 Files.deleteIfExists(file); 46 return FileVisitResult.CONTINUE; 47 } 48 49 @Override postVisitDirectory(final Path dir, final IOException exc)50 public FileVisitResult postVisitDirectory(final Path dir, final IOException exc) throws IOException { 51 if (exc != null) { 52 throw exc; 53 } 54 55 Files.deleteIfExists(dir); 56 return FileVisitResult.CONTINUE; 57 } 58 } 59 } 60