Android中如何通过文件路径判断是否是同一文件

时间:2022-11-25 22:38:42

最近在处理自动扫描文件时,有些手机会有重复文件显示出来问题。经过多方分析。


发现Android的sd卡管理乱得不是一点半点。在有些手机上,只有/mnt/sdcard0存在,在有些手机上,会有/mnt/emulated/0和/mnt/sdcard0存在,且这二个是同一目录,后面的是前面真实路径的软链接目录,在4.2系统后的手机上,会发现有更奇葩的情况出现,会存在/mnt/emulated/0和/mnt/emulated/legacy和/mnt/sdcard0存在,且指向的也是同一目录。而在一些较新的华为手机上,我发现在上面三个目录之外,还存在一个/mnt/sdcard1目录,这个目录是真实外置sd卡的根目录,与上面三目录无关系。


在这种情况下,如果有一个文件路径是/mnt/sdcard0/pictures/pic.jpg,另一个是/mnt/sdcard1/pictures/pic.jpg,再有一个是/mnt/emulated/0/pictures/pic.jpg,最后变态再有一个/mnt/emulated/legacy/pictures/pic.jpg后,如何在不控制顺序的情况下,准确判断出哪二个文件是指向的同一文件,哪二个文件是真实物理上保存的不同目录下同名文件。就在算法上比较麻烦。因先来的文件路径不可控。


最后我找到的较笨办法是:

1.把第一个得到的目录进行忽略列表保存时,把路径进行替换保存,把软链接目录替换成对应的真实目录地址,比如,把得到的/mnt/sdcard0/***替换成/mnt/emulated/0/***进行保存。后面来的路径,都按此规则转换后,再进行路径是否相同的比较。使用到的函数是:

	public static boolean isSymlink(File file) throws IOException {
if (file == null)
throw new NullPointerException("File must not be null");
File canon;
if (file.getParent() == null) {
canon = file;
} else {
File canonDir = file.getParentFile().getCanonicalFile();
canon = new File(canonDir, file.getName());
}
return !canon.getCanonicalFile().equals(file.getAbsoluteFile());
}