在应用程序中,当收到从其他应用程序创建并具有文件路径的意图时,它可以使用文件路径访问文件的内容。
问题是,如果该路径(称为' link-path')是一个“硬链接”'到原始文件,是否可以通过此链接路径找到原始文件?搜索并找到一些帖子,如: https://unix.stackexchange.com/questions/122333/how-to-tell-which-file-is-original-if-hard-link-is-created
他们显示了一些unix shell命令。不确定是否有一些Android文件系统支持,有人有建议吗?
答案 0 :(得分:1)
您可以根据此post使用我创建的代码。它将返回任何路径的目标路径。如果path不是符号链接,它将返回自身。如果路径不存在,则返回null。
concourse:
worker:
config:
name: ci_worker01
bind-ip: 0.0.0.0
bind-port: 7777
tsa-host: 127.0.0.1
tsa-port: 2222
tsa-public-key: /opt/concourse/.ssh/id_web_rsa.pub
tsa-worker-private-key: /opt/concourse/.ssh/id_worker_rsa
service: True
代码没有经过测试,但是我在Termux上测试了命令并且它运行良好。
编辑:尝试在您的文件上调用public static String findLinkTarget(String path) {
try {
Process findTarget = Runtime.getRuntime().exec("readlink -f " + path);
BufferedReader br = new BufferedReader(new InputStreamReader(findTarget.getInputStream()));
return br.readLine();
} catch (IOException e) {
Log.w(TAG, "Couldn't find target file for link: " + path, e);
}
}
,我认为它会解析符号链接。
答案 1 :(得分:0)
通过比较inode找到一种方法,在api> 21中android有Os获取它,否则使用命令“ls -i”来获取inode。但是有一个问题,在api< = 18上测试了“ls -i”并没有返回任何东西(在模拟器上测试过),在这种情况下可能会回退来比较文件的大小和时间戳。
static String getFileInode(File file) {
String inode = "-1";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
StructStat st = null;
try {
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(file,
ParcelFileDescriptor.parseMode("r"));
st = Os.fstat (pfd.getFileDescriptor());
if (st != null) {
inode = ""+st.st_ino;
}
} catch (Exception e) {
Log.e(TAG, "fstat() failed”+ e.getMessage());
}
} else {
BufferedReader reader = null;
try {
Process process = Runtime.getRuntime().exec(("ls -il " + path));
reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
output.append(buffer, 0, read);
}
process.waitFor();
String ret = output.toString();
if (!TextUtils.isEmpty(ret)) {
ret = ret.trim();
String[] splitArr = ret.split("\\s+");
if (splitArr.length>0) {
inode = splitArr[0];
}
}
} catch(Exception e) {
Log.e(TAG, "!!! Runtime.getRuntime().exec() exception, cmd:”+cmd);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {}
}
}
}
return inode;
}