Android获取手机文件夹及文件列表的方法
程序员文章站
2024-03-02 21:20:28
先看看效果图:
package wuwang.tools.utils;
import java.io.file;
import java...
先看看效果图:
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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。