1. 程式人生 > >Android工具類:獲取手機的資料夾及檔案列表

Android工具類:獲取手機的資料夾及檔案列表

效果圖:


package wuwang.tools.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.os.Environment;


/**
 * 用於獲取手機的資料夾及檔案的工具類,如果許可權允許,可以獲取手機上任意路徑的檔案列表
 * GetFilesUtils使用的是懶漢式單例模式,執行緒安全
 *@author wuwang
 *@since 2014.11
 */
public class GetFilesUtils {
	
	public static final String FILE_TYPE_FOLDER="wFl2d";
	
	public static final String FILE_INFO_NAME="fName";
	public static final String FILE_INFO_ISFOLDER="fIsDir";
	public static final String FILE_INFO_TYPE="fFileType";
	public static final String FILE_INFO_NUM_SONDIRS="fSonDirs";
	public static final String FILE_INFO_NUM_SONFILES="fSonFiles";
	public static final String FILE_INFO_PATH="fPath";
	
	private static GetFilesUtils gfu;
	
	private GetFilesUtils(){
		
	}
	
	/**
	 * 獲取GetFilesUtils例項
	 * @return GetFilesUtils
	 **/
	public static synchronized GetFilesUtils getInstance(){
		if(gfu==null){
			gfu=new GetFilesUtils();
		}
		return gfu;
	}
	
	/**
	 * 獲取檔案path資料夾下的檔案列表
	 * @see #getSonNode(String)
	 * @param path 手機上的資料夾
	 * @return path資料夾下的檔案列表的資訊,資訊儲存在Map中,Map的key的列表如下:<br />
	 * 		   FILE_INFO_NAME : String 檔名稱	<br />
	 * 		   FILE_INFO_ISFOLDER: boolean 是否為資料夾	<br />
	 * 		   FILE_INFO_TYPE: string 檔案的字尾	<br />
	 * 		   FILE_INFO_NUM_SONDIRS : int 子檔案夾個數	<br />
	 * 		   FILE_INFO_NUM_SONFILES: int 子檔案個數	<br />
	 * 		   FILE_INFO_PATH : String 檔案的絕對路徑	<br />
	 **/
	public List<Map<String, Object>> getSonNode(File path){
		if(path.isDirectory()){
			List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();
			File[] files=path.listFiles();
			if(files!=null){

				for(int i=0;i<files.length;i++){
					Map<String, Object> fileInfo=new HashMap<String, Object>();
					fileInfo.put(FILE_INFO_NAME, files[i].getName());
					if(files[i].isDirectory()){
						fileInfo.put(FILE_INFO_ISFOLDER, true);
						File[] bFiles=files[i].listFiles();
						if(bFiles==null){
							fileInfo.put(FILE_INFO_NUM_SONDIRS, 0);
							fileInfo.put(FILE_INFO_NUM_SONFILES, 0);
						}else{
							int getNumOfDir=0;
							for(int j=0;j<bFiles.length;j++){
								if(bFiles[j].isDirectory()){
									getNumOfDir++;
								}
							}
							fileInfo.put(FILE_INFO_NUM_SONDIRS, getNumOfDir);
							fileInfo.put(FILE_INFO_NUM_SONFILES, bFiles.length-getNumOfDir);
						}
						fileInfo.put(FILE_INFO_TYPE, FILE_TYPE_FOLDER);
					}else{
						fileInfo.put(FILE_INFO_ISFOLDER, false);
						fileInfo.put(FILE_INFO_NUM_SONDIRS, 0);
						fileInfo.put(FILE_INFO_NUM_SONFILES, 0);
						fileInfo.put(FILE_INFO_TYPE, getFileType(files[i].getName()));
					}
					fileInfo.put(FILE_INFO_PATH, files[i].getAbsoluteFile());
					list.add(fileInfo);
				}
				return list;
			}else{
				return null;
			}
		}else{
			return null;
		}
	}
	/**
	 * 獲取檔案pathStr資料夾下的檔案列表
	 * @see #getSonNode(File)
	 * @param pathStr 手機上的資料夾的絕對路徑
	 * @return pathStr資料夾下的檔案列表的資訊,資訊儲存在Map中,Map的key的列表如下:<br />
	 * 		   FILE_INFO_NAME : String 檔名稱	<br />
	 * 		   FILE_INFO_ISFOLDER: boolean 是否為資料夾	<br />
	 * 		   FILE_INFO_TYPE: string 檔案的字尾	<br />
	 * 		   FILE_INFO_NUM_SONDIRS : int 子檔案夾個數	<br />
	 * 		   FILE_INFO_NUM_SONFILES: int 子檔案個數	<br />
	 * 		   FILE_INFO_PATH : String 檔案的絕對路徑	<br />
	 **/
	public List<Map<String, Object>> getSonNode(String pathStr){
		File path=new File(pathStr);
		return getSonNode(path);
	}
	
	/**
	 * 獲取檔案path檔案或資料夾的兄弟節點檔案列表
	 * @see #getBrotherNode(String)
	 * @param path 手機上的資料夾
	 * @return path資料夾下的檔案列表的資訊,資訊儲存在Map中,Map的key的列表如下:<br />
	 * 		   FILE_INFO_NAME : String 檔名稱	<br />
	 * 		   FILE_INFO_ISFOLDER: boolean 是否為資料夾	<br />
	 * 		   FILE_INFO_TYPE: string 檔案的字尾	<br />
	 * 		   FILE_INFO_NUM_SONDIRS : int 子檔案夾個數	<br />
	 * 		   FILE_INFO_NUM_SONFILES: int 子檔案個數	<br />
	 * 		   FILE_INFO_PATH : String 檔案的絕對路徑	<br />
	 **/
	public List<Map<String, Object>> getBrotherNode(File path){
		if(path.getParentFile()!=null){
			return getSonNode(path.getParentFile());
		}else{
			return null;
		}
	}
	/**
	 * 獲取檔案path檔案或資料夾的兄弟節點檔案列表
	 * @see #getBrotherNode(File)
	 * @param path 手機上的資料夾
	 * @return path資料夾下的檔案列表的資訊,資訊儲存在Map中,Map的key的列表如下:<br />
	 * 		   FILE_INFO_NAME : String 檔名稱	<br />
	 * 		   FILE_INFO_ISFOLDER: boolean 是否為資料夾	<br />
	 * 		   FILE_INFO_TYPE: string 檔案的字尾	<br />
	 * 		   FILE_INFO_NUM_SONDIRS : int 子檔案夾個數	<br />
	 * 		   FILE_INFO_NUM_SONFILES: int 子檔案個數	<br />
	 * 		   FILE_INFO_PATH : String 檔案的絕對路徑	<br />
	 **/
	public List<Map<String, Object>> getBrotherNode(String pathStr){
		File path=new File(pathStr);
		return getBrotherNode(path);
	}
	
	/**
	 * 獲取檔案或資料夾的父路徑
	 * @param File path檔案或者資料夾
	 * @return String path的父路徑
	 **/
	public String getParentPath(File path){
		if(path.getParentFile()==null){
			return null;
		}else{
			return path.getParent();
		}
	}
	/**
	 * 獲取檔案或檔案的父路徑
	 * @param String pathStr檔案或者資料夾路徑
	 * @return String pathStr的父路徑
	 **/
	public String getParentPath(String pathStr){
		File path=new File(pathStr);
		if(path.getParentFile()==null){
			return null;
		}else{
			return path.getParent();
		}
	}

	/**
	 * 獲取sd卡的絕對路徑
	 * @return String 如果sd卡存在,返回sd卡的絕對路徑,否則返回null
	 **/
	public String getSDPath(){
		String sdcard=Environment.getExternalStorageState();
		if(sdcard.equals(Environment.MEDIA_MOUNTED)){
			return Environment.getExternalStorageDirectory().getAbsolutePath();
		}else{
			return null;
		}
	}
	
	/**
	 * 獲取一個基本的路徑,一般應用建立存放應用資料可以用到
	 * @return String 如果SD卡存在,返回SD卡的絕對路徑,如果SD卡不存在,返回Android資料目錄的絕對路徑
	 **/
	public String getBasePath(){
		String basePath=getSDPath();
		if(basePath==null){
			return Environment.getDataDirectory().getAbsolutePath();
		}else{
			return basePath;
		}
	}
	
	/**
	 * 獲取檔案path的大小
	 * @return String path的大小
	 **/
	public String getFileSize(File path) throws IOException{
		if(path.exists()){
	        DecimalFormat df = new DecimalFormat("#.00");
	        String sizeStr="";
			FileInputStream fis=new FileInputStream(path);
			long size=fis.available();
			fis.close();
			if(size<1024){
				sizeStr=size+"B";
			}else if(size<1048576){
				sizeStr=df.format(size/(double)1024)+"KB";
			}else if(size<1073741824){
				sizeStr=df.format(size/(double)1048576)+"MB";
			}else{
				sizeStr=df.format(size/(double)1073741824)+"GB";
			}
			return sizeStr;
		}else{
			return null;
		}
	}
	
	/**
	 * 獲取檔案fpath的大小
	 * @return String path的大小
	 **/
	public String getFileSize(String fpath){
		File path=new File(fpath);
		if(path.exists()){
	        DecimalFormat df = new DecimalFormat("#.00");
	        String sizeStr="";
	        long size=0;
			try {
				FileInputStream fis = new FileInputStream(path);
				size=fis.available();
				fis.close();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return "未知大小";
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return "未知大小";
			}
			if(size<1024){
				sizeStr=size+"B";
			}else if(size<1048576){
				sizeStr=df.format(size/(double)1024)+"KB";
			}else if(size<1073741824){
				sizeStr=df.format(size/(double)1048576)+"MB";
			}else{
				sizeStr=df.format(size/(double)1073741824)+"GB";
			}
			return sizeStr;
		}else{
			return "未知大小";
		}
	}
	
	/**
	 * 根據字尾獲取檔案fileName的型別
	 * @return String 檔案的型別
	 **/
	public String getFileType(String fileName){
		if(fileName!=""&&fileName.length()>3){
			int dot=fileName.lastIndexOf(".");
			if(dot>0){
				return fileName.substring(dot+1);
			}else{
				return "";
			}
		}
		return "";
	}
	
	public Comparator<Map<String, Object>> defaultOrder() {
		
		final String orderBy0=FILE_INFO_ISFOLDER;
		final String orderBy1=FILE_INFO_TYPE;
		final String orderBy2=FILE_INFO_NAME;
		
		Comparator<Map<String, Object>> order=new Comparator<Map<String,Object>>() {

			@Override
			public int compare(Map<String, Object> lhs, Map<String, Object> rhs) {
				// TODO Auto-generated method stub
				int left0=lhs.get(orderBy0).equals(true)?0:1;
				int right0=rhs.get(orderBy0).equals(true)?0:1;
				if(left0==right0){
					String left1=lhs.get(orderBy1).toString();
					String right1=rhs.get(orderBy1).toString();
					if(left1.compareTo(right1)==0){
						String left2=lhs.get(orderBy2).toString();
						String right2=rhs.get(orderBy2).toString();
						return left2.compareTo(right2);
					}else{
						return left1.compareTo(right1);
					}
				}else{
					return left0-right0;
				}
			}
		};

		return order;
	}
	
}

使用方法:List<Map<String, Object>> list=GetFilesUtils.getInstance().getSonNode(file); //或其他方法

使用示例:

package wuwang.mypage.activity;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import wuwang.ebookworm.R;
import wuwang.tools.utils.GetFilesUtils;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class FolderActivity extends Activity implements OnItemClickListener,OnClickListener {

	private ListView folderLv;
	private TextView foldernowTv;
	private SimpleAdapter sAdapter;
	private List<Map<String, Object>> aList;
	private String baseFile;
	
	private TextView titleTv;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.mypage_folder);
		baseFile=GetFilesUtils.getInstance().getBasePath();
		
		titleTv=(TextView) findViewById(R.id.mtitle);
		titleTv.setText("本地檔案");
		
		folderLv=(ListView) findViewById(R.id.folder_list);
		foldernowTv=(TextView) findViewById(R.id.folder_now);
		foldernowTv.setText(baseFile);
		foldernowTv.setOnClickListener(this);
		aList=new ArrayList<Map<String,Object>>();
		sAdapter=new SimpleAdapter(this, aList,R.layout.listitem_folder, new String[]{"fImg","fName","fInfo"},
				new int[]{R.id.folder_img,R.id.folder_name,R.id.folder_info});
		folderLv.setAdapter(sAdapter);
		folderLv.setOnItemClickListener(this);
		try {
			loadFolderList(baseFile);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private void loadFolderList(String file) throws IOException{
		List<Map<String, Object>> list=GetFilesUtils.getInstance().getSonNode(file);
		if(list!=null){
			Collections.sort(list, GetFilesUtils.getInstance().defaultOrder());
			aList.clear();
			for(Map<String, Object> map:list){
				String fileType=(String) map.get(GetFilesUtils.FILE_INFO_TYPE);
				Map<String,Object> gMap=new HashMap<String, Object>();
				if(map.get(GetFilesUtils.FILE_INFO_ISFOLDER).equals(true)){
					gMap.put("fIsDir", true);
					gMap.put("fImg",R.drawable.filetype_folder );
					gMap.put("fInfo", map.get(GetFilesUtils.FILE_INFO_NUM_SONDIRS)+"個資料夾和"+
							map.get(GetFilesUtils.FILE_INFO_NUM_SONFILES)+"個檔案");
				}else{
					gMap.put("fIsDir", false);
					if(fileType.equals("txt")||fileType.equals("text")){
						gMap.put("fImg", R.drawable.filetype_text);
					}else{
						gMap.put("fImg", R.drawable.filetype_unknow);
					}
					gMap.put("fInfo","檔案大小:"+GetFilesUtils.getInstance().getFileSize(map.get(GetFilesUtils.FILE_INFO_PATH).toString()));
				}
				gMap.put("fName", map.get(GetFilesUtils.FILE_INFO_NAME));
				gMap.put("fPath", map.get(GetFilesUtils.FILE_INFO_PATH));
				aList.add(gMap);
			}
		}else{
			aList.clear();
		}
		sAdapter.notifyDataSetChanged();
		foldernowTv.setText(file);
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		// TODO Auto-generated method stub
		try {
			if(aList.get(position).get("fIsDir").equals(true)){
				loadFolderList(aList.get(position).get("fPath").toString());
			}else{
				Toast.makeText(this, "這是檔案,處理程式待新增", Toast.LENGTH_SHORT).show();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		if(v.getId()==R.id.folder_now){
			try {
				String folder=GetFilesUtils.getInstance().getParentPath(foldernowTv.getText().toString());
				if(folder==null){
					Toast.makeText(this, "無父目錄,待處理", Toast.LENGTH_SHORT).show();
				}else{
					loadFolderList(folder);
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
}

頁面的佈局檔案為:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/frame_main_bg" >
    <include layout="@layout/mypage_title_folder"/>
	<TextView android:layout_width="match_parent"
	    android:layout_height="40dp"
	    android:textColor="#FFFFFF"
	    android:textSize="16sp"
	    android:gravity="center_vertical"
	    android:ellipsize="start"
	    android:singleLine="true"
	    android:drawableLeft="@drawable/folder_backupimg"
	    android:paddingLeft="10dp"
	    android:drawablePadding="10dp"
	    android:id="@+id/folder_now"
        android:background="@color/frame_title_bg_clk_color"  />
    <ListView android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/folder_list"
        android:dividerHeight="1dp"
        android:divider="@color/folder_list_divider" >
    </ListView>
</LinearLayout>


相關推薦

Android工具獲取手機資料檔案列表

效果圖: package wuwang.tools.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja

js獲取本地資料檔案列表

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html

工具封裝獲取網路資料+網路圖片的方法

package com.bwie.renzhili; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import com.google.

Java/Android 獲取資料檔案列表(file.listFiles())並按名稱排序,中文優先

排序規則 因為是中國人,習慣性看中文資料夾放前面比較順眼,所以在別人部落格(https://blog.csdn.net/da_caoyuan/article/details/56664673)的基礎上,加上了自己的排序規則。 預設排序規則是按照ASCII碼錶排序(http://asci

Qt總結之二遍歷資料檔案目錄,並過濾和獲取檔案資訊、字尾名、字首名(二)

前言 需要在特定目錄或磁碟下查詢特定檔案 一、篩選目錄 (一)單一目錄下遍歷,篩選特定檔案 QDir dir("./SaveFiles"); QFileInfoList list = dir.entryInfoList(); (二)裝置所有磁碟中遍歷 QF

Qt總結之一遍歷資料檔案目錄,並過濾和獲取檔案資訊、字尾名、字首名(一)

一、採用遞迴和QDir實現資料夾下所有檔案遍歷的方法 #include <QDir> bool FindFile(const QString & path) {     QDir dir(path);   if (!dir.exists(

JS獲取某個資料下的檔名稱,不讀取資料

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <script l

Unity&Android之二獲取手機電量資訊、網路狀況

Unity&Android之二:獲取手機電量資訊、網路狀況 遊戲中經常會在UI顯示電量以及網路狀況 手機電量包括: 1、當前正在充電還是放電 2、當前電量值 網路包括: 1、如果是WIFI,WIFI訊號強度 2、如果是流量,訊號強度等資料

Mapreduce如何獲取讀取資料檔案的名字

 需要注意的導包的時候導這兩個包                     import

Nodejs入門基礎(使用fs建立資料檔案獲取資訊返回頁面)

測試直接ping直接設定的埠號http://localhost:埠號參考程式碼: var fs = require("fs"); var http = require("http"); var url = require("url"); http.createServer(function(r

如何獲取資料或者檔案的許可權

2018年11月05日 17:25:04 菜鳥小福 閱讀數:3 個人分類: 系統

獲取系統資料檔案

獲取檔案目錄 OPENFILENAME ofn; // 公共對話方塊結構。 TCHAR szFile[MAX_PATH]; // 儲存獲取檔名稱的緩衝區。 // 初始化選擇檔案對話方塊。 ZeroMemory(&ofn, sizeof(OPENFILENAME)); ofn.lStr

C# 獲取資料路徑和資料包含檔案列表

FolderBrowserDialog用來選擇資料夾FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.ShowDialog() 之後才會開啟資料夾選擇框。 dialog.SelectedPath是選

如何解決TortoiseSVN資料檔案比對圖示不顯示的問題

TortoiseSVN是一款重要的程式碼管理工具,其最重要的作用之一是可以將本地檔案與雲端檔案進行內容比對,並顯示比對是否有改變,這極大地方便我們快速找到改動過的檔案以上傳或者比對檔案內容的改動部分。然而,很多時候,我們常常遇到TortoiseSVN檔案比對圖示不顯示的問題,其實,這隻要幾部

shll 統計資料檔案個數

shell 統計當前資料夾下的檔案個數、目錄個數 1、 統計當前資料夾下檔案的個數 ls -l | grep "^-" | wc -l 2、 統計當前資料夾下目錄個數 ls -l | grep "^-d" | wc -l 3、 統計當前資料夾下檔案的個數、包括子資料夾裡的 ls -

用VB實現重新命名、拷貝資料檔案

用VB實現重新命名、拷貝資料夾及檔案 Private Sub commandButton1_Click() '宣告資料夾名和路徑 Dim FileName, Path As String, EmptySheet As String 'Path = "D:\上報" Path = Inp

TortoiseSVN資料檔案圖示不顯示解決方法

          由於自己的電腦是win7(64位)的,系統安裝TortoiseSVN之後,其他的功能都能正常的使用,但是就是資料夾或資料夾的左下角就是不顯示圖示,這個問題前一段時間就遇到了(那個時

node.js刪除資料檔案

node.js的fs模組只提供了刪除檔案unlink夾及目錄rmdir的功能,所以一起刪除需要我們遍歷刪除,程式碼如下 var fs = require('fs'); // 引入fs模組 funct

Win7 64位下TortoiseSVN的資料檔案SVN圖示不顯示正確解決方法

      最近為了程式碼版本管理,安裝了SVN服務端與客戶端,安裝TortoiseSVN之後,功能正常,但是就是資料夾或資料夾的左下角就是不顯示SVN圖示,之前在XP上是正常顯示的。通過網路查詢,發

[work] Python 資料檔案操作

我們經常會與檔案和目錄打交道,對於這些操作,python可以使用 os 及 shutill 模組,其中包含了很多操作檔案和目錄的函式。     os 可以執行簡單的資料夾及檔案操作,引入用  import os,可用  help(os)  或是&