| /* |
| * Copyright (C) 2011 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.sdklib.io; |
| |
| import com.android.annotations.NonNull; |
| |
| import java.io.File; |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.OutputStream; |
| import java.util.Properties; |
| |
| |
| /** |
| * Wraps some common {@link File} operations on files and folders. |
| * <p/> |
| * This makes it possible to override/mock/stub some file operations in unit tests. |
| */ |
| public interface IFileOp { |
| |
| /** |
| * Helper to delete a file or a directory. |
| * For a directory, recursively deletes all of its content. |
| * Files that cannot be deleted right away are marked for deletion on exit. |
| * It's ok for the file or folder to not exist at all. |
| * The argument can be null. |
| */ |
| void deleteFileOrFolder(@NonNull File fileOrFolder); |
| |
| /** |
| * Sets the executable Unix permission (+x) on a file or folder. |
| * <p/> |
| * This attempts to use File#setExecutable through reflection if |
| * it's available. |
| * If this is not available, this invokes a chmod exec instead, |
| * so there is no guarantee of it being fast. |
| * <p/> |
| * Caller must make sure to not invoke this under Windows. |
| * |
| * @param file The file to set permissions on. |
| * @throws IOException If an I/O error occurs |
| */ |
| void setExecutablePermission(@NonNull File file) throws IOException; |
| |
| /** |
| * Sets the file or directory as read-only. |
| * |
| * @param file The file or directory to set permissions on. |
| */ |
| void setReadOnly(@NonNull File file); |
| |
| /** |
| * Copies a binary file. |
| * |
| * @param source the source file to copy. |
| * @param dest the destination file to write. |
| * @throws FileNotFoundException if the source file doesn't exist. |
| * @throws IOException if there's a problem reading or writing the file. |
| */ |
| void copyFile(@NonNull File source, @NonNull File dest) throws IOException; |
| |
| /** |
| * Checks whether 2 binary files are the same. |
| * |
| * @param file1 the source file to copy |
| * @param file2 the destination file to write |
| * @throws FileNotFoundException if the source files don't exist. |
| * @throws IOException if there's a problem reading the files. |
| */ |
| boolean isSameFile(@NonNull File file1, @NonNull File file2) |
| throws IOException; |
| |
| /** Invokes {@link File#exists()} on the given {@code file}. */ |
| boolean exists(@NonNull File file); |
| |
| /** Invokes {@link File#isFile()} on the given {@code file}. */ |
| boolean isFile(@NonNull File file); |
| |
| /** Invokes {@link File#isDirectory()} on the given {@code file}. */ |
| boolean isDirectory(@NonNull File file); |
| |
| /** Invokes {@link File#length()} on the given {@code file}. */ |
| long length(@NonNull File file); |
| |
| /** |
| * Invokes {@link File#delete()} on the given {@code file}. |
| * Note: for a recursive folder version, consider {@link #deleteFileOrFolder(File)}. |
| */ |
| boolean delete(@NonNull File file); |
| |
| /** Invokes {@link File#mkdirs()} on the given {@code file}. */ |
| boolean mkdirs(@NonNull File file); |
| |
| /** |
| * Invokes {@link File#listFiles()} on the given {@code file}. |
| * Contrary to the Java API, this returns an empty array instead of null when the |
| * directory does not exist. |
| */ |
| @NonNull |
| File[] listFiles(@NonNull File file); |
| |
| /** Invokes {@link File#renameTo(File)} on the given files. */ |
| boolean renameTo(@NonNull File oldDir, @NonNull File newDir); |
| |
| /** Creates a new {@link OutputStream} for the given {@code file}. */ |
| @NonNull |
| OutputStream newFileOutputStream(@NonNull File file) |
| throws FileNotFoundException; |
| |
| /** Creates a new {@link InputStream} for the given {@code file}. */ |
| @NonNull |
| InputStream newFileInputStream(@NonNull File file) |
| throws FileNotFoundException; |
| |
| /** |
| * Load {@link Properties} from a file. Returns an empty property set on error. |
| * |
| * @param file A non-null file to load from. File may not exist. |
| * @return A new {@link Properties} with the properties loaded from the file, |
| * or an empty property set in case of error. |
| */ |
| @NonNull |
| Properties loadProperties(@NonNull File file); |
| |
| /** |
| * Saves (write, store) the given {@link Properties} into the given {@link File}. |
| * |
| * @param file A non-null file to write to. |
| * @param props The properties to write. |
| * @param comments A non-null description of the properly list, written in the file. |
| * @throws IOException if the write operation failed. |
| */ |
| void saveProperties( |
| @NonNull File file, |
| @NonNull Properties props, |
| @NonNull String comments) throws IOException; |
| |
| /** |
| * Returns the lastModified attribute of the file. |
| * |
| * @see File#lastModified() |
| * @param file The non-null file of which to retrieve the lastModified attribute. |
| * @return The last-modified attribute of the file, in milliseconds since The Epoch. |
| */ |
| long lastModified(@NonNull File file); |
| } |