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