Android:消除文件路径的歧义

ab1*_*b11 10 android

在我的应用中,用户选择文件.在内部,我存储有关文件的信息,我根据文件路径键入该文件.下次使用该文件时,我会处理存储的信息.麻烦的是我实例化我的文件:

File file1 = new File(Environment.getExternalStorageDirectory() + "/test.txt");

然后,在特定的JB设备上,file1.getCanonicalPath()给出:"/ storage_emulated/0/test.txt".

麻烦的是当其他应用程序在Intent中使用文件路径启动我的应用程序时,它们发送的路径往往看起来像:"/ mnt/sdcard/test.txt".

是否有明智的策略来消除这两条路径的歧义?可能我应该以不同方式实例化我的文件?

编辑:

麻烦的是,两个文件的两个canaonical路径不相等.对于以下,cp1=="mnt/sdcard/test/txt"cp2=="/storage/emulated/0/text/txt":

File file1 = new File("/mnt/sdcard/test.txt");
File file2 = new File("/storage/emulated/0/test.txt");

String cp1 = file1.getCanonicalPath();
String cp2 = file2.getCanonicalPath();
Run Code Online (Sandbox Code Playgroud)

Sta*_*kER 5

首先,获取外部路径的唯一正确方法是在Android中使用getExternalStorageDirectory和其他路径getExternalStorageXXX.

Android将首先尝试解析两个系统变量:

String rawExternalStorage = System.getenv(ENV_EXTERNAL_STORAGE);
String rawEmulatedStorageTarget = System.getenv(ENV_EMULATED_STORAGE_TARGET);
Run Code Online (Sandbox Code Playgroud)

ENV_EXTERNAL_STORAGE = "EXTERNAL_STORAGE"ENV_EMULATED_STORAGE_TARGET = "EMULATED_STORAGE_TARGET".如果EMULATED_STORAGE_TARGET设置了变量,则意味着设备已经模拟存储,然后存储路径将是EMULATED_STORAGE_TARGET.(在Android 4.2之后,它支持多用户外部存储,然后路径后面会有一个/ 0或0)但是如果是未设置和EXTERNAL_STORAGE设置,路径将是EXTERNAL_STORAGE.如果未设置它们,则/storage/sdcard0默认情况下路径.因此,不同的设备可能包含不同的外部存储路径.

正如外部存储技术信息所述,您可以通过设置init.rc文件来自定义设备的存储.例如在默认的金鱼中:

export EXTERNAL_STORAGE /mnt/sdcard
mkdir /mnt/sdcard 0000 system system
symlink /mnt/sdcard /sdcard
Run Code Online (Sandbox Code Playgroud)

如果您使用,getExternalStorageDirectory您将获得/mnt/sdcard,但它/sdcard是该目录的符号链接.

所以在你的情况下,init.rc可能包含:

export EMULATED_STORAGE_TARGET /storage/emulated
symlink /storage/emulated/0 /mnt/sdcard
Run Code Online (Sandbox Code Playgroud)

所以它们并不含糊,它们实际上是相同的.

我认为getCanonicalPath()可能适用于绝大多数用例.

规范路径名既是绝对的,也是唯一的.规范形式的精确定义取决于系统.如果需要,此方法首先将此路径名转换为绝对形式,就像调用getAbsolutePath()方法一样,然后以依赖于系统的方式将其映射到其唯一形式.这通常涉及删除冗余名称,例如"." 和路径名中的"..",解析符号链接(在UNIX平台上),并将驱动器号转换为标准情况(在Microsoft Windows平台上).

表示现有文件或目录的每个路径名都具有唯一的规范形式.表示不存在的文件或目录的每个路径名也具有唯一的规范形式.在创建文件或目录之后,不存在的文件或目录的路径名的规范形式可能与相同路径名的规范形式不同.类似地,在删除文件或目录之后,现有文件或目录的路径名的规范形式可以与相同路径名的规范形式不同.

  • 麻烦是,给定两个路径"/mnt/sdcard/test.txt"和"/storage/emulated/0/test.txt":文件file1 =新文件(path1),文件文件2 =新文件(path2).file1.getCanonicalPath().equals(file2.getCanoniclaPath())的计算结果为false,尽管它们指向同一个文件. (3认同)