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"/>

 

posted @ 2020-09-25 09:18  sunny开始学坏  阅读(1004)  评论(0编辑  收藏  举报