com.android.utils.FileUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of common Show documentation
Show all versions of common Show documentation
common library used by other Android tools libraries.
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed 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.android.utils;
import static com.google.common.base.Preconditions.checkArgument;
import com.android.annotations.NonNull;
import com.google.common.base.Charsets;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Iterables;
import com.google.common.hash.Hashing;
import com.google.common.io.Files;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.List;
public final class FileUtils {
private FileUtils() {}
private static final Joiner PATH_JOINER = Joiner.on(File.separatorChar);
private static final Joiner COMMA_SEPARATED_JOINER = Joiner.on(", ");
private static final Joiner UNIX_NEW_LINE_JOINER = Joiner.on('\n');
public static final Function GET_NAME = new Function() {
@Override
public String apply(File file) {
return file.getName();
}
};
@NonNull
public static Predicate withExtension(@NonNull final String extension) {
checkArgument(extension.charAt(0) != '.', "Extension should not start with a dot.");
return new Predicate() {
@Override
public boolean apply(File input) {
return Files.getFileExtension(input.getName()).equals(extension);
}
};
}
public static void deleteFolder(@NonNull final File folder) throws IOException {
if (!folder.exists()) {
return;
}
File[] files = folder.listFiles();
if (files != null) { // i.e. is a directory.
for (final File file : files) {
deleteFolder(file);
}
}
if (!folder.delete()) {
throw new IOException(String.format("Could not delete folder %s", folder));
}
}
public static void emptyFolder(@NonNull final File folder) throws IOException {
deleteFolder(folder);
if (!folder.mkdirs()) {
throw new IOException(String.format("Could not create empty folder %s", folder));
}
}
public static void copy(@NonNull final File from, @NonNull final File toDir)
throws IOException {
File to = new File(toDir, from.getName());
if (from.isDirectory()) {
mkdirs(to);
File[] children = from.listFiles();
if (children != null) {
for (File child : children) {
copy(child, to);
}
}
} else if (from.isFile()) {
Files.copy(from, to);
}
}
public static void mkdirs(@NonNull File folder) {
// attempt to create first.
// if failure only throw if folder does not exist.
// This makes this method able to create the same folder(s) from different thread
if (!folder.mkdirs() && !folder.exists()) {
throw new RuntimeException("Cannot create directory " + folder);
}
}
public static void delete(@NonNull File file) throws IOException {
boolean result = file.delete();
if (!result) {
throw new IOException("Failed to delete " + file.getAbsolutePath());
}
}
public static void deleteIfExists(@NonNull File file) throws IOException {
boolean result = file.delete();
if (!result && file.exists()) {
throw new IOException("Failed to delete " + file.getAbsolutePath());
}
}
public static void renameTo(@NonNull File file, @NonNull File to) throws IOException {
boolean result = file.renameTo(to);
if (!result) {
throw new IOException("Failed to rename " + file.getAbsolutePath() + " to " + to);
}
}
/**
* Joins a list of path segments to a given File object.
*
* @param dir the file object.
* @param paths the segments.
* @return a new File object.
*/
@NonNull
public static File join(@NonNull File dir, @NonNull String... paths) {
if (paths.length == 0) {
return dir;
}
return new File(dir, PATH_JOINER.join(paths));
}
/**
* Joins a list of path segments to a given File object.
*
* @param dir the file object.
* @param paths the segments.
* @return a new File object.
*/
@NonNull
public static File join(@NonNull File dir, @NonNull Iterable paths) {
return new File(dir, PATH_JOINER.join(paths));
}
/**
* Joins a set of segment into a string, separating each segments with a host-specific
* path separator.
* @param paths the segments.
* @return a string with the segments.
*/
@NonNull
public static String join(@NonNull String... paths) {
return PATH_JOINER.join(paths);
}
/**
* Joins a set of segment into a string, separating each segments with a host-specific
* path separator.
* @param paths the segments.
* @return a string with the segments.
*/
@NonNull
public static String join(@NonNull Iterable paths) {
return PATH_JOINER.join(paths);
}
/**
* Loads a text file forcing the line separator to be of Unix style '\n' rather than being
* Windows style '\r\n'.
*/
@NonNull
public static String loadFileWithUnixLineSeparators(@NonNull File file) throws IOException {
return UNIX_NEW_LINE_JOINER.join(Files.readLines(file, Charsets.UTF_8));
}
@NonNull
public static String relativePath(@NonNull File file, @NonNull File dir) {
checkArgument(file.isFile(), "%s is not a file.", file.getPath());
checkArgument(dir.isDirectory(), "%s is not a directory.", dir.getPath());
return relativePossiblyNonExistingPath(file, dir);
}
@NonNull
public static String relativePossiblyNonExistingPath(@NonNull File file, @NonNull File dir) {
String path = dir.toURI().relativize(file.toURI()).getPath();
return toSystemDependentPath(path);
}
@NonNull
public static String toSystemDependentPath(@NonNull String path) {
if (File.separatorChar != '/') {
path = path.replace('/', File.separatorChar);
}
return path;
}
@NonNull
public static String sha1(@NonNull File file) throws IOException {
return Hashing.sha1().hashBytes(Files.toByteArray(file)).toString();
}
@NonNull
public static FluentIterable getAllFiles(@NonNull File dir) {
return Files.fileTreeTraverser().preOrderTraversal(dir).filter(Files.isFile());
}
@NonNull
public static String getNamesAsCommaSeparatedList(@NonNull Iterable files) {
return COMMA_SEPARATED_JOINER.join(Iterables.transform(files, GET_NAME));
}
}