小米開原始檔管理器MiCodeFileExplorer-原始碼研究(4)-檔案操作工具類FileOperationHelper
檔案操作是非常通用的,註釋都寫在原始碼中了,不多說~
需要特別說明的是,任務的非同步執行和IOperationProgressListener。
拷貝和刪除等操作,是比較費時的,採用了非同步執行的方式~
Android非同步執行,我也是初次瞭解,在CSDN上找了一篇文章,後續寫個單獨的例子,單獨寫1篇介紹。
http://blog.csdn.net/xufenghappy6/article/details/7343899
非同步執行+事件通知 是一種比較流行的模式,比同步等待很多時候要好。
另外,特別需要說明的是,Java應用程式中、Android、Windows開發、Linux Shell都會有檔案File的概念,他們本質是一樣的。
檔案的核心概念基本一致,都是用的作業系統的檔案概念,不同作業系統之間的區別也不大。
建立、刪除、重新命名、複製、貼上,輸入-執行-輸出,也都一樣。
需要特別說明的是,任務的非同步執行和IOperationProgressListener。
拷貝和刪除等操作,是比較費時的,採用了非同步執行的方式~
Android非同步執行,我也是初次瞭解,在CSDN上找了一篇文章,後續寫個單獨的例子,單獨寫1篇介紹。
http://blog.csdn.net/xufenghappy6/article/details/7343899
非同步執行+事件通知 是一種比較流行的模式,比同步等待很多時候要好。
另外,特別需要說明的是,Java應用程式中、Android、Windows開發、Linux Shell都會有檔案File的概念,他們本質是一樣的。
檔案的核心概念基本一致,都是用的作業系統的檔案概念,不同作業系統之間的區別也不大。
建立、刪除、重新命名、複製、貼上,輸入-執行-輸出,也都一樣。
package net.micode.fileexplorer.util;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import net.micode.fileexplorer.model.FileInfo;
import android.os.AsyncTask;
import android.os.Environment;
import android.text.TextUtils;
import android.util.Log;
/**檔案操作工具類,執行檔案的建立、移動、貼上、重新命名、刪除等*/
public class FileOperationHelper {
private static final String LOG_TAG = "FileOperation";
//內部檔案集合,用來臨時儲存複製、移動等操作,使用者選擇的檔案集合
private ArrayList<FileInfo> mCurFileNameList = new ArrayList<FileInfo>();
private boolean mMoving;
private IOperationProgressListener mOperationListener;
private FilenameFilter mFilter;
public interface IOperationProgressListener {
void onFinish();
void onFileChanged(String path);
}
public FileOperationHelper(IOperationProgressListener l) {
mOperationListener = l;
}
public void setFilenameFilter(FilenameFilter f) {
mFilter = f;
}
//根據路徑和檔名,建立檔案
public boolean CreateFolder(String path, String name) {
Log.v(LOG_TAG, "CreateFolder >>> " + path + "," + name);
File f = new File(Util.makePath(path, name));
if (f.exists())
return false;
return f.mkdir();
}
//拷貝若干個檔案,把檔案集合拷貝到“當前檔案集合中mCurFileNameList”,可以供“貼上操作”使用
public void Copy(ArrayList<FileInfo> files) {
copyFileList(files);
}
//貼上,把當前檔案集合中“mCurFileNameList”的檔案,拷貝到目標路徑下
public boolean Paste(String path) {
if (mCurFileNameList.size() == 0)
return false;
final String _path = path;
//非同步執行某個任務
asnycExecute(new Runnable() {
@Override
public void run() {
for (FileInfo f : mCurFileNameList) {
CopyFile(f, _path);
}
//通知操作變化
mOperationListener.onFileChanged(Environment
.getExternalStorageDirectory().getAbsolutePath());
//貼上之後,需要清空mCurFileNameList
clear();
}
});
return true;
}
//是否可以“貼上”,mCurFileNameList有元素
public boolean canPaste() {
return mCurFileNameList.size() != 0;
}
//開始移動,標記“正在移動”,拷貝檔案集合
public void StartMove(ArrayList<FileInfo> files) {
if (mMoving)
return;
mMoving = true;
copyFileList(files);
}
//移動狀態
public boolean isMoveState() {
return mMoving;
}
//能否移動,假設path為“C:/a/b”,f.filePath為“C:、/a/b/c/d.png”,不能移動
//TODO 感覺不太靠譜啊,為啥不能移動到檔案的上級目錄呢?
public boolean canMove(String path) {
for (FileInfo f : mCurFileNameList) {
if (!f.IsDir)
continue;
if (Util.containsPath(f.filePath, path))
return false;
}
return true;
}
//清空當前檔案集合
public void clear() {
synchronized (mCurFileNameList) {
mCurFileNameList.clear();
}
}
//停止移動,移動檔案是非同步執行,結束後有事件通知
public boolean EndMove(String path) {
if (!mMoving)
return false;
mMoving = false;
if (TextUtils.isEmpty(path))
return false;
final String _path = path;
asnycExecute(new Runnable() {
@Override
public void run() {
for (FileInfo f : mCurFileNameList) {
MoveFile(f, _path);
}
mOperationListener.onFileChanged(Environment
.getExternalStorageDirectory().getAbsolutePath());
clear();
}
});
return true;
}
public ArrayList<FileInfo> getFileList() {
return mCurFileNameList;
}
//非同步執行某個任務
//android的類AsyncTask對執行緒間通訊進行了包裝,提供了簡易的程式設計方式來使後臺執行緒和UI執行緒進行通訊:後臺執行緒執行非同步任務,並把操作結果通知UI執行緒。
//可以參考http://blog.csdn.net/xufenghappy6/article/details/7343899
private void asnycExecute(Runnable r) {
final Runnable _r = r;
new AsyncTask() {
@Override
protected Object doInBackground(Object... params) {
synchronized (mCurFileNameList) {
_r.run();
}
if (mOperationListener != null) {
mOperationListener.onFinish();
}
return null;
}
}.execute();
}
//某個路徑是否被選中
public boolean isFileSelected(String path) {
synchronized (mCurFileNameList) {
for (FileInfo f : mCurFileNameList) {
if (f.filePath.equalsIgnoreCase(path))
return true;
}
}
return false;
}
//檔案重新命名
public boolean Rename(FileInfo f, String newName) {
if (f == null || newName == null) {
Log.e(LOG_TAG, "Rename: null parameter");
return false;
}
File file = new File(f.filePath);
String newPath = Util.makePath(Util.getPathFromFilepath(f.filePath),
newName);
final boolean needScan = file.isFile();
try {
boolean ret = file.renameTo(new File(newPath));
if (ret) {
if (needScan) {
mOperationListener.onFileChanged(f.filePath);
}
mOperationListener.onFileChanged(newPath);
}
return ret;
} catch (SecurityException e) {
Log.e(LOG_TAG, "Fail to rename file," + e.toString());
}
return false;
}
//刪除若干檔案,先copy檔案集合,再非同步執行刪除操作,刪除完成後,有通知
public boolean Delete(ArrayList<FileInfo> files) {
copyFileList(files);
asnycExecute(new Runnable() {
@Override
public void run() {
for (FileInfo f : mCurFileNameList) {
DeleteFile(f);
}
mOperationListener.onFileChanged(Environment
.getExternalStorageDirectory().getAbsolutePath());
clear();
}
});
return true;
}
//刪除1個檔案
protected void DeleteFile(FileInfo f) {
if (f == null) {
Log.e(LOG_TAG, "DeleteFile: null parameter");
return;
}
File file = new File(f.filePath);
boolean directory = file.isDirectory();
if (directory) {
for (File child : file.listFiles(mFilter)) {
if (Util.isNormalFile(child.getAbsolutePath())) {
DeleteFile(Util.GetFileInfo(child, mFilter, true));
}
}
}
file.delete();
Log.v(LOG_TAG, "DeleteFile >>> " + f.filePath);
}
//執行1個檔案的拷貝,如果檔案是目錄,拷貝整個目錄,可能有遞迴Copy
private void CopyFile(FileInfo f, String dest) {
if (f == null || dest == null) {
Log.e(LOG_TAG, "CopyFile: null parameter");
return;
}
File file = new File(f.filePath);
if (file.isDirectory()) {
// directory exists in destination, rename it
String destPath = Util.makePath(dest, f.fileName);
File destFile = new File(destPath);
int i = 1;
while (destFile.exists()) {
destPath = Util.makePath(dest, f.fileName + " " + i++);
destFile = new File(destPath);
}
for (File child : file.listFiles(mFilter)) {
if (!child.isHidden()
&& Util.isNormalFile(child.getAbsolutePath())) {
CopyFile(Util.GetFileInfo(child, mFilter, Settings
.instance().getShowDotAndHiddenFiles()), destPath);
}
}
} else {
String destFile = Util.copyFile(f.filePath, dest);
}
Log.v(LOG_TAG, "CopyFile >>> " + f.filePath + "," + dest);
}
//移動檔案,通過重新命名的方式,移動的
private boolean MoveFile(FileInfo f, String dest) {
Log.v(LOG_TAG, "MoveFile >>> " + f.filePath + "," + dest);
if (f == null || dest == null) {
Log.e(LOG_TAG, "CopyFile: null parameter");
return false;
}
File file = new File(f.filePath);
String newPath = Util.makePath(dest, f.fileName);
try {
return file.renameTo(new File(newPath));
} catch (SecurityException e) {
Log.e(LOG_TAG, "Fail to move file," + e.toString());
}
return false;
}
//把檔案集合copy到mCurFileNameList中,同步~
private void copyFileList(ArrayList<FileInfo> files) {
synchronized (mCurFileNameList) {
mCurFileNameList.clear();
for (FileInfo f : files) {
mCurFileNameList.add(f);
}
}
}
}
相關文章
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(8)-檔案排序工具類FileSortHelper原始碼排序
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(3)-使用最多的工具類Util原始碼
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(0)-初步研究原始碼
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(2)-2個單例項工具類原始碼單例
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(9)-入口分析原始碼
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(6)-媒體檔案MediaFile和檔案型別MimeUtils原始碼型別
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(1)-2個模型Model原始碼模型
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(5)-AsyncTask非同步任務原始碼非同步
- 小米開原始檔管理器MiCodeFileExplorer-原始碼研究(7)-Favorite收藏管理和SQLite資料庫CRUD原始碼SQLite資料庫
- VB原始碼推薦:一個操作Ini檔案的類 (轉)原始碼
- Java™ 教程(管理原始檔和類檔案)Java
- Vue原始碼探究-原始碼檔案組織Vue原始碼
- Golang 原始碼學習(一) —— os/file 檔案操作Golang原始碼
- 開發工具類-簡單檔案操作相關
- Android工具類之檔案操作工具類Android
- Java檔案操作工具類FileUtilsJava
- Lucene原始碼解析--Lock檔案原始碼
- 入口檔案開始,分析Vue原始碼實現Vue原始碼
- 檔案操作類FileUtil
- PHP檔案分享系統原始碼PHP原始碼
- 原始碼解析Flask的配置檔案原始碼Flask
- Android 常用開發工具類原始碼Android原始碼
- FLASHCS3多檔案上傳原始碼(類似uccenter社群)S3原始碼
- 安卓第一個作品 檔案管理器 附原始碼帶詳細註釋安卓原始碼
- Java : File 檔案類操作Java
- Dropzone 4 for Mac(檔案拖拽操作增強工具)Mac
- Mac檔案拖拽操作增強工具:Dropzone 4Mac
- Dropzone 4 for Mac 檔案拖拽操作增強工具Mac
- XML檔案原始碼察看器(三) (轉)XML原始碼
- XML檔案原始碼察看器(四) (轉)XML原始碼
- XML檔案原始碼察看器(七) (轉)XML原始碼
- XML檔案原始碼察看器(二) (轉)XML原始碼
- XML檔案原始碼察看器(五) (轉)XML原始碼
- XML檔案原始碼察看器(六) (轉)XML原始碼
- cmakelist 原始碼生成so 檔案 orthanc mysql原始碼MySql
- Free5GC原始碼研究(4) - AUSF研究GC原始碼
- java屬性檔案properties常用操作工具類Java
- Spring原始碼:使用Thymeleaf生成PDF檔案Spring原始碼