Android:打开不可读的目录

时间:2014-08-06 18:17:48

标签: android file shell unix root

有一种很好的方法可以在不可读的目录中获取文件,目录,链接的信息吗?

目前我使用Chainfire的libsuperuser库,它使我的应用程序能够以root /超级用户权限运行ls -l之类的Shell命令。所以我能列出像'/ data / data'这样的目录内容。

/ directory:

的示例
drwxr-xr-x root     root              1970-08-10 14:44 acct
drwxrwx--- system   cache             2014-08-06 18:03 cache
-rwxr-x--- root     root       272364 1970-01-01 01:00 charger
dr-x------ root     root              1970-08-10 14:44 config
lrwxrwxrwx root     root              1970-08-10 14:44 d -> /sys/kernel/debug
drwxrwx--x system   system            2014-08-05 20:33 data
-rw-r--r-- root     root          286 1970-01-01 01:00 default.prop
drwxr-xr-x root     root              2014-08-05 20:36 dev
lrwxrwxrwx root     root              1970-08-10 14:44 etc -> /system/etc
and so on...

对于我的根文件管理器项目,我想将这些信息包装到Java对象中。但问题是'ls -l'的输出很难解析(因为用户可以在文件名中使用空格,可能在不同的Android版本上输出不同的'ls'......)。因此,即使我能够创建一个能够读取'ls -l'输出的解析器,它也可能非常错误且不可靠。

所以现在我想问一下是否有更好的解决方案来获取不可读目录中的文件信息(如unix-permission,owner,group ...)?

提前致谢

1 个答案:

答案 0 :(得分:0)

尝试使用正则表达式从每行中提取文件名:

\d{2}:\d{2}\s(.+)$

我假设ls命令的输出始终相同:

drwxrwx--- system   cache             2014-08-06 18:03 cache

我们有一些文件信息,日期,时间和文件名。所以,你的代码将是这样的:

Pattern pattern = Pattern.compile("\\d{2}:\\d{2}\\s(.+)$");

for (String line : lsLines) {
    Matcher matcher = pattern.matcher(line);

    if (matcher.find()) {
        String filename;
        String tempFilename = matcher.group(1);

        if (tempFilename.indexOf(" -> ") > -1) {
            filename = tempFilename.split(" -> ")[1];
        } else {
            filename = tempFilename;
        }

        // Do something with filename
    }
}