/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * See LICENSE.txt included in this distribution for the specific * language governing permissions and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at LICENSE.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011 Trond Norbye */ package org.opensolaris.opengrok.util; import java.io.Closeable; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.opensolaris.opengrok.logger.LoggerFactory; /** * A small utility class to provide common functionality related to * IO so that we don't need to duplicate the logic all over the place. * * @author Trond Norbye <trond.norbye@gmail.com> */ public final class IOUtils { private static final Logger LOGGER = LoggerFactory.getLogger(IOUtils.class); private IOUtils() { // singleton } public static void close(Closeable c) { if (c != null) { try { c.close(); } catch (IOException e) { LOGGER.log(Level.WARNING, "Failed to close resource: ", e); } } } /** * Delete directory recursively. This method does not follow symlinks. * @param path directory to delete * @throws IOException if any read error */ public static void removeRecursive(Path path) throws IOException { Files.walkFileTree(path, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { // Try to delete the file anyway. Files.delete(file); return FileVisitResult.CONTINUE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { if (exc == null) { Files.delete(dir); return FileVisitResult.CONTINUE; } else { // Directory traversal failed. throw exc; } } }); } /** * List files in the directory recursively. * * @param root starting directory * @return recursively traversed list of files with given suffix */ public static List<File> listFilesRec(File root) { return listFilesRec(root, null); } /** * List files in the directory recursively when looking for files only * ending with suffix. * * @param root starting directory * @param suffix suffix for the files * @return recursively traversed list of files with given suffix */ public static List<File> listFilesRec(File root, String suffix) { List<File> results = new ArrayList<>(); List<File> files = listFiles(root); for (File f : files) { if (f.isDirectory() && f.canRead() && !f.getName().equals(".") && !f.getName().equals("..")) { results.addAll(listFilesRec(f, suffix)); } else if (suffix != null && !suffix.isEmpty() && f.getName().endsWith(suffix)) { results.add(f); } else if (suffix == null || suffix.isEmpty()) { results.add(f); } } return results; } /** * List files in the directory. * * @param root starting directory * @return list of file with suffix */ public static List<File> listFiles(File root) { return listFiles(root, null); } /** * List files in the directory when looking for files only ending with * suffix. * * @param root starting directory * @param suffix suffix for the files * @return list of file with suffix */ public static List<File> listFiles(File root, String suffix) { File[] files = root.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { if (suffix != null && !suffix.isEmpty()) { return suffix != null && !suffix.isEmpty() && name.endsWith(suffix); } else { return true; } } }); if (files == null) { return new ArrayList<>(); } return Arrays.asList(files); } }