/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.sun.jini.system; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.ArrayList; /** * Miscellaneous file system manipulation methods. * * @author Sun Microsystems, Inc. * */ public class FileSystem { /** * Remove this completely. If the parameter is a directory, it is * removed after recursively destroying all its contents, including * subdirectories. If the named file does not exist, * <code>destroy</code> simply returns. * * @param proceed * Proceed in the face of errors; otherwise the first error stops * the execution of the method. * @throws IOException * The list of files that couldn't be removed (in the detail string). */ public static void destroy(File file, boolean proceed) throws IOException { if (!file.exists() || file.delete()) // that was easy return; ArrayList errors = (proceed ? new ArrayList() : null); destroyDir(file, errors); if (errors != null && errors.size() != 0) { StringBuffer buf = new StringBuffer("couldn't delete:"); for (int i = 0; i < errors.size(); i++) buf.append('\n').append(errors.get(i)); throw new IOException(buf.toString()); } } /** * Perform the recursion for <code>destroy</code>. */ private static void destroyDir(File dir, Collection errors) throws IOException { if (!dir.isDirectory()) { // catch assumption that this is a dir handleError(errors, dir); return; } String[] names = dir.list(); for (int i = 0; i < names.length; i++) { File file = new File(dir, names[i]); if (!file.delete()) // assume it's a dir destroyDir(file, errors); } if (!dir.delete()) handleError(errors, dir); } /** * Handle an error, either by adding to the list, or if there is no * list, throwing an <code>IOException</code>. */ private static void handleError(Collection errors, File path) throws IOException { if (errors == null) throw new IOException("couldn't delete " + path); errors.add(path); } /** * Ensure that the given path is a directory, creating it if * necessary. If the path exists it must be a directory. * It the path does not exist this method uses * <code>File.mkdirs</code> to create the directory along with any * intermediate paths. * * @throws IllegalArgumentException * if the path already exists but is not a * directory, or it does not exist and cannot be created. */ public static void ensureDir(String path) throws IllegalArgumentException { File dir = new File(path); if (dir.isDirectory()) return; else if (dir.exists()) throw new IllegalArgumentException(path + " exists, but not a dir"); if (!dir.mkdirs()) throw new IllegalArgumentException(path + ": cannot create"); } }