/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.common.file;
import java.io.File;
/**
* Utility class to visit a file tree.
* There's similar functionality in Java 7's Files.walkFileTree method.
* Its methods could be merge into FileUtil (although it seems to have a lot of
* crazy redundant methods, maybe for testing, but crazy anyway).
*/
public class FileTree {
/**
* Iterates over the file tree of a directory. It receives a visitor and will call its methods
* for each file in the directory.
* preVisitDirectory (directory)
* visitFile (file)
* - recursively the same for every subdirectory
* postVisitDirectory (directory)
* @param directory the directory to iterate
* @param visitor the visitor that will be invoked for each directory/file in the tree
*/
public static void walkFileTree(File directory, FileTreeVisitor visitor) {
visitor.preVisitDirectory(directory);
File[] files = directory.listFiles();
if (files != null) {
for (File file: files) {
if (file.isDirectory()) {
walkFileTree(file, visitor);
} else {
visitor.visitFile(file);
}
}
}
visitor.postVisitDirectory(directory);
}
/**
* Deletes all files and subdirectories in directory (doesn't delete the directory
* passed as parameter).
*/
public static boolean deleteContents(File directory) {
File[] files = directory.listFiles();
boolean success = true;
if (files != null) {
for (File file : files) {
success &= deleteRecursively(file);
}
}
return success;
}
/**
* Deletes the file and if it's a directory deletes also any content in it
* @param file a file or directory
* @return true if the file/directory could be deleted
*/
public static boolean deleteRecursively(File file) {
if (file.isDirectory()) {
deleteContents(file);
}
// if I can delete directory then I know everything was deleted
return file.delete();
}
}