android10拷貝最近的log資料夾並重新命名為txt
平臺: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
相關文章
- 深究cp拷貝資料夾時`/`的用法
- iOS - 拷貝resource資原始檔夾iOS
- ubuntu拷貝資料夾到另外一個資料夾下,如何寫shell命令:Ubuntu
- Mac拷貝/複製資料夾路徑快捷鍵Mac
- 如何將資料夾批次重新命名並翻譯?
- xcopy 實現批處理拷貝檔案或資料夾
- js資料型別賦值,淺拷貝,深拷貝JS資料型別賦值
- 重新命名資料夾名字
- JavaScript資料型別AND深拷貝和淺拷貝的不歸路JavaScript資料型別
- iOS 圖文並茂的帶你瞭解深拷貝與淺拷貝iOS
- 大量資料夾批次重新命名的操作
- js的深拷貝和淺拷貝JS
- 物件的深拷貝與淺拷貝物件
- logminer是否可以分析從其他資料庫拷貝過來的日誌資料庫
- 【轉】[C#] 重新命名資料夾C#
- [20180718]拷貝資料檔案從dg庫.txt
- vue深拷貝淺拷貝Vue
- python 指標拷貝,淺拷貝和深拷貝Python指標
- JavaScript中的淺拷貝與深拷貝JavaScript
- VUE 中 的深拷貝和淺拷貝Vue
- 對淺拷貝和深拷貝的理解
- 淺拷貝與深拷貝的實現
- 【JavaScript】物件的淺拷貝與深拷貝JavaScript物件
- 【JS】深拷貝與淺拷貝,實現深拷貝的幾種方法JS
- 一文搞懂Java引用拷貝、淺拷貝、深拷貝Java
- jquery之物件拷貝深拷貝淺拷貝案例講解jQuery物件
- C++拷貝建構函式(深拷貝,淺拷貝)C++函式
- iOS深拷貝和淺拷貝iOS
- JS深拷貝與淺拷貝JS
- Java深拷貝和淺拷貝Java
- 物件深拷貝和淺拷貝物件
- javascript 淺拷貝VS深拷貝JavaScript
- JavaScript 深度拷貝和淺拷貝JavaScript
- JavaScript深拷貝和淺拷貝JavaScript
- js 淺拷貝和深拷貝JS
- js 深拷貝和淺拷貝JS
- JavaScript淺拷貝和深拷貝JavaScript
- js深拷貝和淺拷貝JS