package tv.acfun.a63.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import tv.acfun.a63.AcApp;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.StatFs;
import android.text.TextUtils;
import android.util.Log;
import com.alibaba.fastjson.util.IOUtils;
import com.umeng.analytics.MobclickAgent;
public class FileUtil {
public static Uri getLocalFileUri(File file){
return Uri.fromFile(file);
}
public static long getFolderSize(File folder) {
if(folder == null) return 0;
long size = 0;
File[] files = folder.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory())
size = size + getFolderSize(files[i]);
else
size = size + files[i].length();
}
return size;
}
/**
* @see {@link FileUtil#getFolderSize(File)}
* @param folder
* @return
*/
public static String getFormatFolderSize(File folder){
return formatFileSize(getFolderSize(folder));
}
/*** 格式化文件大小(xxx.xx B/KB/MB/GB) */
public static String formatFileSize(long size) {
if(size <=0) return "0B";
DecimalFormat df = new DecimalFormat("#.00");
String fileSizeString = "";
if (size < _1KB)
fileSizeString = df.format((double) size) + "B";
else if (size < _1MB)
fileSizeString = df.format((double) size / _1KB) + "KB";
else if (size < _1GB)
fileSizeString = df.format((double) size / _1MB) + "MB";
else
fileSizeString = df.format((double) size / _1GB) + "GB";
return fileSizeString;
}
/**
* 显示SD卡剩余空间
*
* @return SD卡不存在则返回null
*/
public static String showFileAvailable() {
long availableSize = getExternalAvailable();
if (availableSize > 0)
return formatFileSize(availableSize);
return null;
}
/**
* 获得SD卡剩余空间
*
* @return SD卡未挂载则返回-1
*/
@SuppressWarnings("deprecation")
public static long getExternalAvailable() {
if (AcApp.isExternalStorageAvailable()) {
StatFs sf = new StatFs(Environment.getExternalStorageDirectory().getPath());
long blockSize = sf.getBlockSize();
long availCount = sf.getAvailableBlocks();
return availCount * blockSize;
} else
return -1;
}
/**
* "/" ~ "?"之间的".xxx"
* @param url
* @return
*/
public static String getUrlExt(String url) {
if (!TextUtils.isEmpty(url)) {
int start = url.lastIndexOf('/');
int end = url.lastIndexOf('?');
end = end <= start ? url.length() : end;
if (start > 0 && start < url.length() - 1) {
String ext = url.substring(start, end).toLowerCase(Locale.US);
int dot = ext.lastIndexOf('.');
if (dot > 0)
return ext.substring(dot);
}
}
return ".jpg";
}
public static String guessVideoMimetype(String ext){
String mimetype = null;
if(".flv".equals(ext)){
mimetype = "video/x-flv";
}else if(".f4v".equals(ext)){
mimetype = "video/x-f4v";
}else if(".mp4".equals(ext)){
mimetype = "video/mp4";
}else mimetype = "video/*";
/* else if(".hlv".equals(ext)){
mimetype = "video/x-f4v"; // XXX: mimetype of hlv???
}*/
return mimetype;
}
public static final int _1KB = 1024;
public static final int _1MB = _1KB * _1KB;
public static final int _1GB = _1KB * _1MB;
/**
* @param type the http header, content-type
* @return
*/
public static String getMimeType(String type) {
if (type == null) {
return null;
}
type = type.trim().toLowerCase(Locale.US);
final int semicolonIndex = type.indexOf(';');
if (semicolonIndex != -1) {
type = type.substring(0, semicolonIndex);
}
return type;
}
public static String getHashName(String url){
return String.valueOf(url.hashCode()) + getUrlExt(url);
}
public static String getName(String url,boolean raw) {
if (!TextUtils.isEmpty(url)) {
if (raw) {
int start = url.lastIndexOf('/');
int end = url.lastIndexOf('?');
end = end <= start ? url.length() : end;
String name = "";
if (start > 0 && start < url.length() - 1) {
try {
name = url.substring(start, end).toLowerCase();
return name;
} catch (StringIndexOutOfBoundsException e) {
Log.e("Util", "when get url name : " + url, e);
}
}
}
return getHashName(url);
}
return "cache";
}
public static void copyStream(InputStream in, OutputStream out) throws IOException {
byte[] buf = new byte[4*_1KB];
int len = -1;
while((len = in.read(buf))!=-1){
out.write(buf,0,len);
}
buf = null;
}
/**
* 简单的hash 散列存储
* @param type 文件根目录名
* @param fileUri 文件 uri
* @return 缓存文件
*/
public static File generateCacheFile(String type, String fileUri){
int hashCode = fileUri.hashCode();
String folderName = String.format("%x", hashCode & 0xf);
String fileName = String.format("%x", hashCode >>> 4)+getUrlExt(fileUri);
File cache =new File(AcApp.getExternalCacheDir(type+"/"+folderName),fileName);
return cache;
}
/**
* 图片缓存路径
* @param imgUri
* @return
*/
public static File generateImageCacheFile(String imgUri){
return generateCacheFile(AcApp.IMAGE,imgUri);
}
public static boolean deleteFiles(File file){
if(file == null) return false;
if(file.isFile()) return file.delete();
else{
String[] progArray = new String[]{"rm","-r",file.getAbsolutePath()};
try {
Runtime.getRuntime().exec(progArray);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
public static final int MSG_DELETE_OK = 200;
public static final int MSG_DELETE_FAILED = 300;
public static void deleteFilesAsync(final File file, final Handler handler) {
new Thread() {
public void run() {
boolean ok = deleteFiles(file);
if(handler != null){
if(ok)
handler.sendEmptyMessage(MSG_DELETE_OK);
else
handler.sendEmptyMessage(MSG_DELETE_FAILED);
}
}
}.start();
}
/**
*
* @param source folder
* @param dest folder
* @return
*/
public static boolean move(String source, String dest) {
File sourceFile = new File(source);
List<String> sourceArray = new ArrayList<String>();
sourceArray.add(0, "mv");
if(sourceFile.isDirectory()){
for(File file : sourceFile.listFiles()){
sourceArray.add(file.getAbsolutePath());
}
}else{
sourceArray.add(source);
}
new File(dest).mkdirs();
sourceArray.add(dest);
String[] arr = sourceArray.toArray(new String[sourceArray.size()]);
try {
Runtime.getRuntime().exec(arr);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public static boolean validate(String file){
File f = new File(file);
if(f.exists() && f.canWrite()) return f.isDirectory();
return f.mkdirs();
}
/**
*
* @param sourceFile
* @param destDir
* @return
*/
public static File copy(File sourceFile, String destDir){
if(!sourceFile.exists()) return null;
InputStream in = null;
OutputStream out = null;
File saveFolder = new File(destDir);
if(!saveFolder.isDirectory()){
if(saveFolder.isFile()) saveFolder.delete();
saveFolder.mkdirs();
}
try {
in = new FileInputStream(sourceFile);
File saveFile = new File(saveFolder, sourceFile.getName());
out = new FileOutputStream(saveFile);
copyStream(in, out);
return saveFile;
} catch (Exception ex) {
MobclickAgent.reportError(AcApp.context(),
"Failed to copy: source=" + sourceFile.getAbsolutePath()
+ ",dest=" + destDir + "\n"
+ ex.toString());
} finally {
IOUtils.close(in);
IOUtils.close(out);
}
return null;
}
public static boolean save(byte[] bytes, String savePath){
FileOutputStream out = null;
try {
File saveFile = new File(savePath);
if(saveFile.isDirectory()){
saveFile = new File(savePath,String.valueOf(System.currentTimeMillis()));
}
if(!saveFile.exists()){
saveFile.getParentFile().mkdirs();
}
out = new FileOutputStream(saveFile);
out.write(bytes);
return true;
} catch (Exception e) {
return false;
} finally {
IOUtils.close(out);
}
}
}