android10拷貝最近的log資料夾並重新命名為txt

yhm2046發表於2020-12-01

平臺:rk3399

系統:Android10

編譯器:android studio

需求:收到廣播後拷貝 /data/vendor/logs/ 下面最新的資料夾到 /sdcard/tmp 下並重新命名為 txt字尾

思路:

1.拷貝 /data/vendor/logs/ 到  /sdcard/tmp

2.篩選出最新的資料夾,刪除其他資料夾

3.遍歷最新資料夾下所有檔案新增字尾txt

參考:

* Java File中renameTo的介紹和使用說明:  https://blog.csdn.net/u010648555/article/details/78356040
* 呼叫file.renameTo 方法失敗     https://blog.csdn.net/river_walker/article/details/85161946
* 關於java中 renameTo()方法的不成功 https://blog.csdn.net/iamlihongwei/article/details/61198410
* file.listFiles()按檔名稱、日期、大小排序方法 總結   https://blog.csdn.net/da_caoyuan/article/details/56664673
* Android 10 讀寫 外接儲存無效 https://blog.csdn.net/EthanCo/article/details/104290388
* java批量新增檔案字尾 https://blog.csdn.net/office5845/article/details/77775886

測試結果:

AndroidManif.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.myapplication">

    <uses-permission android:name="android.permission.READ_LOGS" tools:ignore="ProtectedPermissions"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" tools:ignore="ProtectedPermissions"/>
    <permission android:name="com.example.myapplication.MyReceiver"></permission> <!--android10必須要加入廣播許可權,否則報錯:java.lang.RuntimeException: Error receiving broadcast Intent-->
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name=".MyService"
            android:enabled="true"
            android:exported="true"></service>

        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true" />

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

主方法:

 File fileAll=new File("/sdcard/tmp/");  //資料夾路徑
        File fileList[]=fileAll.listFiles();    //資料夾列表陣列
        if(fileList==null)
            Log.i(TAG,"filelist is null............");
        else
        {
//            遞迴刪除除了最新資料夾外的所有資料夾
            for (int i=0;i<fileList.length-1;i++){
                Log.i(TAG,"刪除資料夾"+fileList[i].getAbsolutePath());
                delete(fileList[i].getAbsolutePath());
            }
//            最新資料夾下所有檔案加txt字尾
            Log.i(TAG,"保留資料夾"+fileList[fileList.length-1].getName());
            File folderTxt=fileList[fileList.length-1];
            File fileLeastTxt[]=folderTxt.listFiles();
            for (File fileTmp:fileLeastTxt){    //遍歷所有檔案加字尾
                File newFile=new File(fileTmp.getAbsoluteFile()+".txt");
                if(!newFile.exists()&&!newFile.isDirectory()){
                    Log.i(TAG,"地址不存在。要新建");
                    newFile.mkdirs();
                }
                fileTmp.renameTo(newFile);
                fileTmp.delete();   //刪掉原始檔案
            }
            //列印當前目錄下所有檔案
//           printAllFiles("/sdcard/tmp/");
            printAllFilesFromFodler(folderTxt);
        }   //end else

工具方法

/**
     * 遍歷列印指定資料夾下的所有檔案
     * @param fodler
     */
    public  void printAllFilesFromFodler(File fodler){
//    File fileAll=new File(path);  //資料夾路徑
    File fileList[]=fodler.listFiles();    //資料夾列表陣列
    if (fileList==null)
        Log.i(TAG,"此目錄下為空............");
    else{
        Log.i(TAG,"此目錄不為空,列表如下:");
        for (int i=0;i<fileList.length;i++){
            Log.i(TAG,fileList[i].getName());
        }//end for
    }//end else
}//end printAllFilesFromFodler
    /**
     * 遍歷列印指定路徑下的所有檔案
     * @param path
     */
    public void printAllFiles(String path){
    File fileAll=new File(path);  //資料夾路徑
    File fileList[]=fileAll.listFiles();    //資料夾列表陣列
    if (fileList==null)
        Log.i(TAG,"此目錄下為空............");
    else{
        Log.i(TAG,"此目錄不為空,列表如下:");
        for (int i=0;i<fileList.length;i++){
            Log.i(TAG,fileList[i].getName());
        }//end for
    }//end else
}// end printAllFiles

 * 複製一個目錄及其子目錄、檔案到另外一個目錄
     * @param src
     * @param dest
     * @throws IOException
     */
    private void copyFolder(File src, File dest) throws IOException {
        if (src.isDirectory()) {
            if (!dest.exists()) {
                dest.mkdir();
            }
            String files[] = src.list();
            for (String file : files) {
                File srcFile = new File(src, file);
                File destFile = new File(dest, file);
                // 遞迴複製
                copyFolder(srcFile, destFile);
            }
        } else {
            InputStream in = new FileInputStream(src);
            OutputStream out = new FileOutputStream(dest);
            byte[] buffer = new byte[1024];
            int length;
            while ((length = in.read(buffer)) > 0) {
                out.write(buffer, 0, length);
            }
            in.close();
            out.close();
        }
    }   //end copyFile

 /**
     * 檢查是否有許可權
     * @param permission    許可權名稱:String型別,Manifest.permission.READ_LOGS
     */
    private void getPermision(String permission) {
        int result2=ActivityCompat.checkSelfPermission(this, permission);
        if (result2 == PackageManager.PERMISSION_GRANTED)
        {
             Log.i(TAG,"有許可權");
        }
        else {
             Log.i(TAG,"無許可權,開始獲取");
            ActivityCompat.requestPermissions(this, new String[]{permission}, 1);
        }
        result2=ActivityCompat.checkSelfPermission(this, permission);
        Log.i(TAG,permission+"最終許可權為--》"+result2);
    }   //end getPermission

 /**
     * 遞迴刪除指定目錄下所有檔案
     * @param path
     */
    public void delete(String path){
        File f=new File(path);
        if(f.isDirectory()){//如果是目錄,先遞迴刪除
            String[] list=f.list();
            for(int i=0;i<list.length;i++){
                delete(path+"//"+list[i]);//先刪除目錄下的檔案
            }
        }
        f.delete();
    }   //end delete

 

相關文章