Android编一段在指定目录下找到重复文件并将其显示给用户看的代码
时间: 2023-12-21 07:04:22 浏览: 127
好的,以下是一段基于Java语言的Android代码:
public class MainActivity extends AppCompatActivity {
private Button btnFindDuplicates;
private TextView tvDuplicate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnFindDuplicates = findViewById(R.id.btn_find_duplicate);
tvDuplicate = findViewById(R.id.tv_duplicate);
btnFindDuplicates.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
File dir = new File(Environment.getExternalStorageDirectory() + "/folder"); // 指定目录
List<File> duplicates = findDuplicates(dir);
if (duplicates.size() > 0) { // 找到了重复文件
StringBuilder sb = new StringBuilder();
for (File f : duplicates) {
sb.append(f.getName()).append("\n");
}
tvDuplicate.setText(sb.toString());
} else { // 没有重复文件
tvDuplicate.setText("没有找到重复文件!");
}
}
});
}
private List<File> findDuplicates(File root) {
List<File> duplicates = new ArrayList<>();
if (root == null || !root.isDirectory()) return duplicates;
Map<String, File> map = new HashMap<>();
Queue<File> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
File dir = queue.poll();
File[] files = dir.listFiles();
if (files == null) continue; // 无法访问该目录
for (File file : files) {
if (file.isDirectory()) {
queue.offer(file);
} else {
String key = file.getName() + file.length(); // 将文件名和大小作为key
if (!map.containsKey(key)) {
map.put(key, file);
} else {
File existingFile = map.get(key);
if (existingFile != null) { // 该文件已被标记为重复
duplicates.add(existingFile);
map.put(key, null); // 标记为已找到
}
duplicates.add(file);
}
}
}
}
return duplicates;
}
}
请确保已在AndroidManifest.xml文件中添加了读写存储权限。这段代码使用了广度优先搜索算法来查找指定目录下的所有文件,并将它们的文件名和大小作为key存入Map中,重复的文件名会映射到同一个key上。最后,遍历map,将value为空的key对应的文件加入到重复文件列表中。
阅读全文