Android递归方式删除某文件夹下的所有文件

本文介绍了如何在Android平台上使用递归方法彻底删除指定文件夹下的所有文件和子文件夹。核心代码展示了具体的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.由于需要删除文件,因此需要如下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

2.核心代码

package com.example.deleteyoumi;

import java.io.File;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
/*
 *@author: ZhengHaibo  
 *web:     http://blog.csdn.net/nuptboyzhb
 *mail:    zhb931706659@126.com
 *2013-4-28  Nanjing,njupt,China
 */
public class DeleteYouMiMainActivity extends Activity implements
		OnClickListener {
	private Button deleteButton;
	private final static String youmiPathString = "/mnt/sdcard/Android/data/.youmicache/";//文件夹的路径

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_delete_you_mi_main);
		deleteButton = (Button) findViewById(R.id.delete_youmi);
		deleteButton.setOnClickListener(this);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.delete_you_mi_main, menu);
		return true;
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.delete_youmi:
			File file = new File(youmiPathString);
			DeleteFile(file);
			mHandler.sendEmptyMessage(1);
			break;
		default:
			break;
		}
	}
	Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 0:
				Toast.makeText(getApplicationContext(), "文件或文件夹不存在", Toast.LENGTH_LONG).show();
				break;
			case 1:
				Toast.makeText(getApplicationContext(), "删除成功!", Toast.LENGTH_LONG).show();
				break;
			default:
				break;
			}
		};
	};
	/**
	 * 递归删除文件和文件夹
	 * 
	 * @param file
	 *            要删除的根目录
	 */
	public void DeleteFile(File file) {
		if (file.exists() == false) {
			mHandler.sendEmptyMessage(0);
			return;
		} else {
			if (file.isFile()) {
				file.delete();
				return;
			}
			if (file.isDirectory()) {
				File[] childFile = file.listFiles();
				if (childFile == null || childFile.length == 0) {
					file.delete();
					return;
				}
				for (File f : childFile) {
					DeleteFile(f);
				}
				file.delete();
			}
		}
	}
}


3.拓展
本博客是以删除为例。当然,对于遍历某文件夹下的所有文件均可用这个方法。如搜索.mp3文件等。
<think>首先,用户的问题是:使用ADB命令删除某个文件夹下的所有文件,但保留空文件夹,且该文件夹中不包含子文件夹。意思是删除文件夹中的所有文件,但文件夹本身保留为空,并且没有子文件夹(所以文件都是直接在该文件夹下的)。 关键点: - 删除所有文件:移除文件夹中的所有文件。 - 保留空文件夹文件夹本身不被删除。 - 没有子文件夹:所以不需要递归处理子目录。 ADB(Android Debug Bridge)是一个命令行工具,用于与Android设备通信。我需要提供一个ADB命令来实现这个。 在ADB中,我们可以使用`adb shell`来在设备上执行命令。常见的删除文件命令是`rm`(remove)。 由于用户指定了没有子文件夹,所以我们可以简单地删除文件夹下的所有文件,而不需要处理递归。 在Linux/Unix系统中(Android基于Linux),要删除一个目录下的所有文件,但保留目录本身,可以使用`rm`命令。例如:`rm /path/to/directory/*`。 但是,`rm /path/to/directory/*`会删除所有文件和符号链接,但不会删除隐藏文件(以点开头的文件)。用户可能想删除所有文件,包括隐藏文件。 更全面的方式是使用`rm /path/to/directory/{*,.*}`,但这可能会尝试删除`.`和`..`,这会导致错误,因为`.`是当前目录,`..`是父目录,不能被删除。 安全的方法是: - 使用`find`命令:但由于没有子文件夹,`find`可能过于复杂。 - 或者,使用`rm -f /path/to/directory/*`和`rm -f /path/to/directory/.*`,但要小心`.`和`..`。 更好的方法是使用`rm -f /path/to/directory/* /path/to/directory/.*`,但排除`.`和`..`。实际上,`rm`命令在尝试删除`.`和`..`时会失败,但不会影响其他文件。 在脚本中,更健壮的方式是: ```sh adb shell "cd /path/to/directory && rm -f * .[^.]*" ``` 但`.[^.]*`可能不匹配所有隐藏文件,因为有些隐藏文件如`..foo`。 在ADB shell中,我们可以直接使用: ```sh adb shell "rm -f '/path/to/directory/'*" adb shell "rm -f '/path/to/directory/'.*" ``` 但第二条命令会尝试删除`.`和`..`,导致错误。 错误消息可以忽略,或者我们可以过滤掉`.`和`..`。 一个简单的方式是使用: ```sh adb shell "find '/path/to/directory' -maxdepth 1 -type f -delete" ``` `find`命令可以更精确地控制: - `-maxdepth 1`:只搜索当前目录,不递归。 - `-type f`:只匹配文件。 - `-delete`:删除匹配的文件。 这应该只删除文件,保留目录,并且不会删除`.`或`..`。 用户提到“该文件夹中不包含子文件夹”,所以`-maxdepth 1`是合适的。 命令: ```sh adb shell "find '/path/to/directory' -maxdepth 1 -type f -delete" ``` 如果设备不支持`-delete`选项(一些Android设备的`find`可能不支持`-delete`),我们可以使用`-exec rm {} +`。 所以更兼容的版本: ```sh adb shell "find '/path/to/directory' -maxdepth 1 -type f -exec rm {} +" ``` 或者,使用`rm`直接: ```sh adb shell "rm -f '/path/to/directory/'*" ``` 但这可能不删除隐藏文件。 为了删除所有文件,包括隐藏文件(但不包括`.`和`..`),我们可以: ```sh adb shell "rm -f '/path/to/directory/'* '/path/to/directory/'.??* '/path/to/directory/'.'[!.]'*" ``` 但这很复杂,并且可能不健壮。 最安全的方式是使用`find`,因为它可以明确指定文件类型。 用户说“文件夹中不包含子文件夹”,所以`rm *`应该工作,但隐藏文件可能被忽略。 在上下文中,用户可能不关心隐藏文件,但为了完整,我应该提供一个删除所有文件的方案。 但用户的问题没有指定是否包括隐藏文件。所以,我可以提供两种方案:简单版(不包括隐藏文件)和完整版(包括隐藏文件)。 简单版: ```sh adb shell "rm -f '/path/to/directory/'*" ``` 完整版: ```sh adb shell "find '/path/to/directory' -maxdepth 1 -type f -exec rm {} +" ``` 在ADB命令中,路径需要正确指定。用户需要替换`/path/to/directory`为实际路径。 另外,确保设备已连接,ADB已授权。 现在,回答结构: - 解释问题。 - 提供命令。 - 解释命令如何工作。 - 注意事项。 最后,生成相关问题,如指令所示。 指令说:"生成相关问题",在示例中,有"§§相关问题§§"部分。 所以,我需要包括相关问题。 引用:系统指令提到引用,但用户提供的引用是关于ADB的其他内容(如帧缓冲区、9-patch),与删除文件无关。用户说“上述引用仅供参考”,所以我应该忽略这些引用,除非相关。 用户引用: - [^1]: 关于adb shell和Ctrl-c - [^2]: 关于捕获帧缓冲区并转换为PNG - [^3]: 关于9-patch工具 这些与删除文件无关,所以我不会在回答中引用它们。专注于用户的问题。 回答语言:中文。 完整回答: 1. 介绍解决方案。 2. 提供命令。 3. 解释。 4. 注意事项。 5. 相关问题。</think>### ADB命令删除文件夹中所有文件但保留空文件夹(无子文件夹) 要使用ADB命令删除指定文件夹下的所有文件(包括隐藏文件),但保留空文件夹本身,且该文件夹中**不包含子文件夹**(即所有文件均在顶层目录),可以通过在ADB shell中执行`find`命令实现。以下是详细步骤和命令: #### 解决方案 1. **核心命令**: 在ADB shell中使用`find`命令,指定目录路径、最大深度为1(避免递归文件夹)、仅匹配文件类型(`-type f`),并执行删除操作。命令格式如下: ```sh adb shell "find '/指定/目录/路径' -maxdepth 1 -type f -exec rm -f {} +" ``` - **示例**(假设要删除`/sdcard/MyFolder`下的所有文件): ```sh adb shell "find '/sdcard/MyFolder' -maxdepth 1 -type f -exec rm -f {} +" ``` 2. **命令解释**: - `find '/指定/目录/路径'`:定位到目标文件夹(需替换为实际路径)。 - `-maxdepth 1`:仅处理当前目录,不进入子文件夹(确保无子文件夹时安全)。 - `-type f`:仅匹配文件(不包括目录或符号链接)。 - `-exec rm -f {} +`:对匹配的文件执行`rm -f`强制删除(`-f`忽略不存在的文件)。 - **效果**:删除所有文件后,文件夹本身保留为空目录。 #### 注意事项 1. **路径格式**: - 使用**绝对路径**(如`/sdcard/...`),避免相对路径错误。 - 路径需用双引号包裹(如`"/path"`),防止空格导致解析失败。 - 示例:如果路径是`/sdcard/Download/Temp`,命令为: ```sh adb shell "find '/sdcard/Download/Temp' -maxdepth 1 -type f -exec rm -f {} +" ``` 2. **设备权限**: - 确保ADB已授权(设备开启USB调试),否则命令会失败。 - 如果目标文件夹在系统保护区域(如`/system`),可能需要root权限。普通应用数据目录(如`/sdcard`)通常无需root。 3. **错误处理**: - 如果目录不存在或路径错误,命令会返回错误(如`find: '/bad/path': No such file or directory`)。 - 使用`adb shell`前,可通过`adb shell ls "/指定/目录/路径"`验证目录是否存在。 4. **备选方案(仅删除非隐藏文件)**: 如果不需要删除隐藏文件(以`.`开头的文件),可用更简单的`rm`命令: ```sh adb shell "rm -f '/指定/目录/路径'/*" ``` - 示例:`adb shell "rm -f '/sdcard/MyFolder'/*"` - **局限性**:不删除隐藏文件(如`.config`),且若目录为空会报错(但目录仍保留)。 #### 验证步骤 1. 执行删除命令后,使用以下命令检查目录是否为空: ```sh adb shell "ls -A '/指定/目录/路径'" ``` - 如果输出为空(无文件),则表示成功。 2. 查看目录元数据,确认其未被删除: ```sh adb shell "stat '/指定/目录/路径'" ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值