package com.ctriposs.bigcache.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileUtil {
private static final int BUFFER_SIZE = 4096 * 4;
/**
* Only check if a given filename is valid according to the OS rules.
*
* You still need to handle other failures when actually creating
* the file (e.g. insufficient permissions, lack of drive space, security restrictions).
* @param file the name of a file
* @return true if the file is valid, false otherwise
*/
public static boolean isFilenameValid(String file) {
File f = new File(file);
try {
f.getCanonicalPath();
return true;
} catch (IOException e) {
return false;
}
}
public static void deleteDirectory(File dir) {
if (!dir.exists()) return;
File[] subs = dir.listFiles();
if (subs != null) {
for (File f : dir.listFiles()) {
if (f.isFile()) {
if(!f.delete()) {
throw new IllegalStateException("delete file failed: "+f);
}
} else {
deleteDirectory(f);
}
}
}
if(!dir.delete()) {
throw new IllegalStateException("delete directory failed: "+dir);
}
}
public static void deleteFile(File file) {
if (!file.exists() || !file.isFile()) {
return;
}
if (!file.delete()) {
throw new IllegalStateException("delete file failed: "+file);
}
}
/**
* Copy a directory and all of its contents.
*
* @param from source file
* @param to target file
* @return success or failure
*/
public static boolean copyDirectory(File from, File to) {
return copyDirectory(from, to, (byte[]) null);
}
public static boolean copyDirectory(String from, String to) {
return copyDirectory(new File(from), new File(to));
}
public static boolean copyDirectory(File from, File to, byte[] buffer) {
if (from == null) return false;
if (!from.exists()) return true;
if (!from.isDirectory()) return false;
if (to.exists()) return false;
if (!to.mkdirs()) return false;
String[] list = from.list();
// Some JVMs return null for File.list() when the directory is empty.
if (list != null) {
if (buffer == null) buffer = new byte[BUFFER_SIZE]; // return this buffer to copy files
for(int i = 0; i < list.length; i++) {
String fileName = list[i];
File entry = new File(from, fileName);
if (entry.isDirectory()) {
if (!copyDirectory(entry, new File(to, fileName), buffer)) {
return false;
}
}
else {
if (!copyFile(entry, new File(to, fileName), buffer)) {
return false;
}
}
}
}
return true;
}
public static boolean copyFile(File from, File to, byte[] buf) {
if (buf == null) buf = new byte[BUFFER_SIZE];
FileInputStream from_s = null;
FileOutputStream to_s = null;
try {
from_s = new FileInputStream(from);
to_s = new FileOutputStream(to);
for(int bytesRead = from_s.read(buf); bytesRead > 0; bytesRead = from_s.read(buf)) {
to_s.write(buf, 0, bytesRead);
}
to_s.getFD().sync();
} catch (IOException ioe) {
return false;
} finally {
if (from_s != null) {
try {
from_s.close();
from_s = null;
} catch (IOException ioe) {
}
}
if (to_s != null) {
try {
to_s.close();
to_s = null;
} catch (IOException ioe) {
}
}
}
return true;
}
}