当前位置: 移动技术网 > IT编程>移动开发>Android > Android获取手机文件夹及文件列表的方法

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

ems价格查询,红天地人才网,钱学森女儿

先看看效果图:


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> 

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网