在android上如果得到一个硬链接如何找到原始文件

时间:2017-02-06 20:17:14

标签: android filesystems hardlink

在应用程序中,当收到从其他应用程序创建并具有文件路径的意图时,它可以使用文件路径访问文件的内容。

问题是,如果该路径(称为' link-path')是一个“硬链接”'到原始文件,是否可以通过此链接路径找到原始文件?

搜索并找到一些帖子,如: https://unix.stackexchange.com/questions/122333/how-to-tell-which-file-is-original-if-hard-link-is-created

他们显示了一些unix shell命令。不确定是否有一些Android文件系统支持,有人有建议吗?

2 个答案:

答案 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;
}