package org.mortbay.ijetty.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.mortbay.ijetty.AppConstants;
import org.mortbay.ijetty.network.InterfaceOp;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
public class FileUtil {
public static class SyncListFile {
public List<File> delFiles;
public List<File> addFiles;
@Override
public String toString() {
return "SyncListFile [delFiles=" + delFiles + ", addFiles="
+ addFiles + "]";
}
public List<File> getDelFiles() {
return delFiles;
}
public void setDelFiles(List<File> delFiles) {
this.delFiles = delFiles;
}
public List<File> getAddFiles() {
return addFiles;
}
public void setAddFiles(List<File> addFiles) {
this.addFiles = addFiles;
}
}
public static String getFileName(String url) {
return url.substring(url.lastIndexOf('/') + 1);
}
public static String getDownloadUrl(List<InterfaceOp.ADFile> ads,
String filename) {
if (TextUtils.isEmpty(filename))
return null;
for (InterfaceOp.ADFile ad : ads) {
if (TextUtils.isEmpty(ad.filename))
continue;
String fn = FileUtil.getFileName(ad.url);
if (fn.equals(filename))
return ad.url.replaceAll("\\\\", "");
}
return null;
}
public static SyncListFile syncList(List<File> srcLst, List<File> dstLst) {
List<File> delFiles = new LinkedList<File>();
List<File> addFiles = new LinkedList<File>();
SyncListFile syncLst = new SyncListFile();
if (dstLst == null && srcLst == null) {
return syncLst;
}
if (dstLst == null) {
if (srcLst != null) {
delFiles.addAll(srcLst);
syncLst.setDelFiles(delFiles);
}
return syncLst;
} else if (srcLst == null) {
if (dstLst != null) {
addFiles.addAll(dstLst);
syncLst.setAddFiles(addFiles);
}
return syncLst;
}
delFiles.addAll(srcLst);
addFiles.addAll(dstLst);
for (File file : dstLst) {
if (delFiles.contains(file))
delFiles.remove(file);
}
for (File file : srcLst) {
if (addFiles.contains(file))
addFiles.remove(file);
}
syncLst.setAddFiles(addFiles);
syncLst.setDelFiles(delFiles);
return syncLst;
}
public static SyncListFile syncListADS(List<File> srcLst, Map<File, Long> dstLst) {
List<File> delFiles = new LinkedList<File>();
List<File> addFiles = new LinkedList<File>();
SyncListFile syncLst = new SyncListFile();
if (dstLst == null && srcLst == null) {
return syncLst;
}
if (dstLst == null) {
if (srcLst != null) {
delFiles.addAll(srcLst);
syncLst.setDelFiles(delFiles);
}
return syncLst;
} else if (srcLst == null) {
if (dstLst != null) {
addFiles.addAll(dstLst.keySet());
syncLst.setAddFiles(addFiles);
}
return syncLst;
}
delFiles.addAll(srcLst);
addFiles.addAll(dstLst.keySet());
// for (File file : dstLst) {
// if (delFiles.contains(file))
// delFiles.remove(file);
// }
Iterator<Entry<File, Long>> iter = dstLst.entrySet().iterator();
while (iter.hasNext()) {
Entry<File, Long> entry = (Entry<File, Long>) iter.next();
File file = entry.getKey();
long filesize = entry.getValue();
if (delFiles.contains(file) && file.length() == filesize)
delFiles.remove(file);
}
for (File file : srcLst) {
if (addFiles.contains(file)) {
long filesize = file.length();
long adsize = dstLst.get(file);
if (filesize == adsize)
addFiles.remove(file);
}
}
syncLst.setAddFiles(addFiles);
syncLst.setDelFiles(delFiles);
return syncLst;
}
public static List<File> getDstList(List<InterfaceOp.ADFile> ads) {
List<File> dstFiles = new LinkedList<File>();
for (InterfaceOp.ADFile ad : ads) {
if (TextUtils.isEmpty(ad.filename))
continue;
if (ad.delFlag)
continue;
if (TextUtils.isEmpty(ad.url))
continue;
dstFiles.add(new File(AppConstants.getMediaSdFolder() + "/"
+ FileUtil.getFileName(ad.url)));
}
if (dstFiles.size() < 1)
return null;
return dstFiles;
}
public static Map<File, Long> getDstListADS(List<InterfaceOp.ADFile> ads) {
Map<File, Long> dstFiles = new LinkedHashMap<File, Long>();
for (InterfaceOp.ADFile ad : ads) {
if (TextUtils.isEmpty(ad.filename))
continue;
if (ad.delFlag)
continue;
if (TextUtils.isEmpty(ad.url))
continue;
dstFiles.put(
new File(AppConstants.getMediaSdFolder() + "/"
+ FileUtil.getFileName(ad.url)), ad.filesize);
}
if (dstFiles.size() < 1)
return null;
return dstFiles;
}
public static List<File> getSrcList() {
File mediaFolder = new File(AppConstants.getMediaSdFolder());
if (!mediaFolder.exists())
mediaFolder.mkdirs();
File[] srcFileArrs = mediaFolder.listFiles(new FileFilter() {
public boolean accept(File file) {
if (file == null)
return false;
if (file.isDirectory())
return false;
String path = file.getAbsolutePath().toLowerCase();
if (path.endsWith(".mp4") || path.endsWith(".rmvb")
|| path.endsWith(".mpg") || path.endsWith(".vob")
|| path.endsWith(".3gp") || path.endsWith(".avi")
|| path.endsWith(".rm") || path.endsWith(".mov")
|| path.endsWith(".flv") || path.endsWith(".mkv"))
return true;
return false;
}
});
if(srcFileArrs == null) return null;
List<File> srcLst = Arrays.asList(srcFileArrs);
if (srcLst == null || srcLst.size() < 1)
return null;
return srcLst;
}
public static List<String> getSrcFileNameList(){
List<File> localFiles = FileUtil.getSrcList();
List<String> filesNameList = new ArrayList<String>();
for(final File f : localFiles)
{
filesNameList.add(f.getName());
}
return filesNameList;
}
public static File renameTmp(String tmpFilename) {
if (!tmpFilename.endsWith(".tmp"))
return null;
File file = new File(tmpFilename);
if (!file.exists())
return null;
if (!file.isFile())
return null;
int endIndex = tmpFilename.lastIndexOf(".tmp");
File newFile = new File(tmpFilename.substring(0, endIndex));
if (newFile.exists()) {
newFile.delete();
}
if (file.renameTo(newFile))
return newFile;
return null;
}
public static boolean putObject(String path, Object object) {
FileOutputStream fos = null;
ObjectOutputStream oos = null;
File f = new File(path);
try {
fos = new FileOutputStream(f);
oos = new ObjectOutputStream(fos);
oos.writeObject(object); // 括号内参数为要保存java对象
return true;
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
try {
if (oos != null)
oos.close();
if (fos != null)
fos.close();
} catch (Exception e) {
f.delete();
e.printStackTrace();
}
}
}
public static Object getObject(String path) {
FileInputStream fis = null;
ObjectInputStream ois = null;
File f = new File(path);
try {
fis = new FileInputStream(f);
ois = new ObjectInputStream(fis);
return ois.readObject();// 强制类型转换
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (ois != null)
ois.close();
if (fis != null)
fis.close();
} catch (Exception e) {
f.delete();
e.printStackTrace();
}
}
return null;
}
public static boolean checkSDMounted() {
String cmd = "df";
Runtime runtime = Runtime.getRuntime();
BufferedReader br = null;
InputStream input = null;
try {
Process process = runtime.exec(cmd);
input = process.getInputStream();
br = new BufferedReader(new InputStreamReader(input));
StringBuilder sb = new StringBuilder();
String strLine;
while (null != (strLine = br.readLine())) {
sb.append(strLine + "\r\n");
}
String content = sb.toString();
// Log.e("gary", "content: :" + content);
return content.contains("external_");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null)
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
if (input != null)
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
// public static boolean hasSdcard() {
// StatFs stat = new StatFs(AppConstants.MEDIA_SD_FOLDER);
// long bytesAvailable = (long) stat.getBlockSize()
// * (long) stat.getBlockCount();
// if(bytesAvailable > 3000000000L)
// return true;
// return false;
// }
public static void getSdFolder(Context pContext) {
PackageManager vPM = pContext.getPackageManager();
try {
PackageInfo vPackageInfo = vPM.getPackageInfo(
"com.mylayout.app.media", 0);
if (vPackageInfo != null && vPackageInfo.versionCode > 19) {
File vDelFile = new File(Environment
.getExternalStorageDirectory().getAbsolutePath()
+ "/"
+ AppConstants.MEDIA_FOLDER);
File[] vFiles = vDelFile.listFiles();
if(vFiles != null && vFiles.length > 0) {
for(File vFile : vDelFile.listFiles()) {
vFile.delete();
}
}
vDelFile.delete();
}
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 复制文件
public static void copyFile(File sourceFile,File targetFile)
throws IOException{
// 新建文件输入流并对它进行缓冲
FileInputStream input = new FileInputStream(sourceFile);
BufferedInputStream inBuff=new BufferedInputStream(input);
// 新建文件输出流并对它进行缓冲
FileOutputStream output = new FileOutputStream(targetFile);
BufferedOutputStream outBuff=new BufferedOutputStream(output);
// 缓冲数组
byte[] b = new byte[1024 * 5];
int len;
while ((len =inBuff.read(b)) != -1) {
outBuff.write(b, 0, len);
}
// 刷新此缓冲的输出流
outBuff.flush();
//关闭流
inBuff.close();
outBuff.close();
output.close();
input.close();
}
}