android全盘文件扫描功能
0.先上成品图:
运行中:
运行结束:
思路:
其实所有文件目录可以抽象为一棵多叉树,根节点下有文件,有文件夹,在处于文件夹时当前文件夹又是一个节点,在那个节点中又会有文件或者文件夹.如此递归即可.主递归函数如下:
public void alldir(String path) { //String path 是开始的根节点 List<String> filexx = getFilesAllName(path); for (int k = 0; k < filexx.size(); k++) { if(!isfilefun(filexx.get(k))){ try { numx+=1; /* * 对文件夹操作写在这里,文件夹路径是filexx.get(k). */ mHandler.sendMessage(addMessage(MSG_COMPLETE,"[DIR]" + filexx.get(k))); } catch (Exception c) { mHandler.sendMessage(addMessage(MSG_COMPLETE,"出错")); } alldir(filexx.get(k));//遇到子节点,进行递归 } else{ try { numx+=1; /* * 对文件操作写在这里,文件路径是filexx.get(k). */ mHandler.sendMessage(addMessage(MSG_COMPLETE,"[FILE]" + filexx.get(k))); } catch (Exception b) { mHandler.sendMessage(addMessage(MSG_COMPLETE,"出错")); } } } }
获取文件夹下文件名
getFilesAllName()
代码如下:
private static List<String> getFilesAllName(String path) { //返回String path下的文件名 List<String> s = new ArrayList<>(); File file=new File(path); File[] files=file.listFiles(); if (files != null){ for (File value : files) { s.add(value.getAbsolutePath()); } } return s; }
子线程中使用Handler传递消息给主线程改变UI.
所有代码如下:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/MAINTV" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java:
import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.TextView; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private static final int MSG_COMPLETE = 10002; // private static ClipboardManager TextView; String path = "/sdcard/"; int numx=0; private TextView TextView; protected Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(@NonNull Message msg) { if (msg.what == MSG_COMPLETE) { TextView.setText(msg.obj.toString()); } return false; } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView = (TextView) findViewById(R.id.MAINTV); new Thread() { public void run() { // alldir(path);. fun();//装饰后的函数,输出运行时间 } }.start(); } public boolean isfilefun(String path){ File file = new File(path); if(file.isDirectory()){ return false; } if(file.isFile()){ return true; } else return true; } public void fun(){ //装饰alldir()函数 long ts =new Date().getTime(); System.out.println(ts); alldir(path); final long ox = new Date().getTime()-ts; runOnUiThread(new Runnable() { @Override public void run() { TextView.setText("共有"+numx+"个文件,用时"+ox+"毫秒"); } }); } public String findNum(String path) { //找数字,没用 String str = path; String reg = "/([0-9]{1,9})/com.*"; Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str); while (m.find()) { System.out.println(m.group(1)); return m.group(1); } return "0";//异常返回0 } public void alldir(String path) { //String path 是开始的根节点 List<String> filexx = getFilesAllName(path); for (int k = 0; k < filexx.size(); k++) { if(!isfilefun(filexx.get(k))){ try { numx+=1; /* * 对文件夹操作写在这里,文件夹路径是filexx.get(k). */ mHandler.sendMessage(addMessage(MSG_COMPLETE,"[DIR]" + filexx.get(k))); } catch (Exception c) { mHandler.sendMessage(addMessage(MSG_COMPLETE,"出错")); } alldir(filexx.get(k)); } else{ try { numx+=1; /* * 对文件操作写在这里,文件路径是filexx.get(k). */ mHandler.sendMessage(addMessage(MSG_COMPLETE,"[FILE]" + filexx.get(k))); } catch (Exception b) { mHandler.sendMessage(addMessage(MSG_COMPLETE,"出错")); } } } } private static List<String> getFilesAllName(String path) { //返回String path下的文件名 List<String> s = new ArrayList<>(); File file=new File(path); File[] files=file.listFiles(); if (files != null){ for (File value : files) { s.add(value.getAbsolutePath()); } } return s; } private Message addMessage(int what, Object object) { Message message = new Message(); message.obj = object; message.what = what; return message; } }
最后注意在Manifest.xml中申明存储权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>