欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android获取手机文件夹及文件列表的方法

程序员文章站 2024-03-31 17:37:16
先看看效果图: package wuwang.tools.utils; import java.io.file; import java...

先看看效果图:

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> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。