爬行 Android 文件系统陷入可能的 SymLink 循环

2024-03-11

我正在尝试在没有 NIO 的情况下抓取 Android 设备的整个文件系统(包括目录和文件)来构建它的树。如果我有 NIO,那么我可以使用 WalkTree 或类似的,但我没有。

我遇到的问题(在 Nexus 5 API 23 x86 模拟器上)是/sys/bus/pci/devices以及可能的其他目录(例如/proc/self) - 在应用程序超时/退出/崩溃(未知)之前它不会完成,可能会进入某种循环或其他东西(路径可能会以重复的方式改变,但规范路径变化很小或根本没有变化) 。

但是,如果我排除符号链接,那么这个问题就会消失,但我得到的只是设备上的部分文件,而不是全部 - 例如,缺少文件/data (or /data/media/0)以及那些没有显示在其他地方的文件 - 更不用说它看起来与大多数文件管理器显示的文件系统完全不同。前者很奇怪,因为我知道符号链接指向文件系统中仍然存在的文件和文件夹,但只是让它们看起来好像在其他地方。

解决办法是什么?我是否必须编写异常或特殊处理代码/sys/bus/pci/devices, /proc/self和别的?如果可以的话,我希望保留符号链接,并且希望爬网尽可能多的文件和文件夹(因此不首选从子文件夹开始)。

还有一些可能影响我最终采取的方法的相关问题 - 如果我保留符号链接,那么这是否意味着某些内容将被抓取两次或更多次?有办法避免这种情况吗?除了遵循 SymLink 并检查 CanonicalPath 之外,是否有其他方法可以检测某物何时是 SymLink 的目标?

这是我的代码:

我得到了根(我知道在 Android 中,第一个且可能是唯一的根是有效的):

File[] roots = File.listRoots();
String rootPath = "";
try {
    rootPath = roots[0].getCanonicalPath();
} catch (IOException e) {
    // do something
}

然后我开始爬行(注意选择是否忽略 simlinks 的布尔值):

try {
    // check if the rootPath is null or empty, and then...
    File rootFile = new File(rootPath);
    rootNode = new FileFolderNode(rootFile, null, true, false);   // last param may be true to ignore sim links
    //FileFolderNode(String filePath, FileFolderNode parent, boolean addChildren, boolean ignoreSimLinks)
} catch (Exception e) {
    // do something
}

它使用 FileFolderNode,它有构造函数:

    public FileFolderNode(File file, FileFolderNode parent, boolean addChildren, boolean ignoreSimLinks) throws IOException {
    if (file == null)
        throw new IOException("File is null in new FileFolderNode");

    if (!file.exists())
        throw new IOException("File '" + file.getName() + "' does not exist in new FileFolderNode");

    // for now this uses isSymLink() from https://svn.apache.org/repos/asf/commons/_moved_to_git/io/trunk/src/main/java/org/apache/commons/io/FileUtils.java adjusted a bit to remove Java 7 and Windows mentions
    if (!ignoreSimLinks)
       if (FileUtils.isSymlink(file))
          return;

    this.name = file.getName();
    if (this.name.equals("") && ! file.getCanonicalPath().equals("/"))
        throw new IOException("Name is empty in new FileFolderNode");

    this.isDirectory = file.isDirectory();
    if (this.isDirectory) {
        this.children = new ArrayList<FileFolderNode>();

        if (addChildren) {
            File[] files = file.listFiles();
            if (files == null) {
                // do something
            } else {
                // add in children
                for (File f : files) {
                    FileFolderNode child = null;
                    try {
                        child = new FileFolderNode(f, this, addChildren, ignoreSimLinks);
                    } catch (Exception e) {
                        child = null;
                    }
                    if (child != null)
                        children.add(child);
                }
            }
        }
    }
}

鉴于这里缺乏答案,我已将这个问题分解为需要澄清的区域,并试图找到这些问题的答案 - 请看看您是否可以帮助解决这些问题:

获取Android文件系统root https://stackoverflow.com/questions/59606203/get-android-filing-system-root

Android 符号链接到隐藏或单独的位置或分区 https://stackoverflow.com/questions/59606639/android-symlinks-to-hidden-or-separate-locations-or-partitions

避免 Android 符号链接循环 https://stackoverflow.com/questions/59678418/avoiding-android-symbolic-link-loop


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬行 Android 文件系统陷入可能的 SymLink 循环 的相关文章

随机推荐

  • 了解为什么 Zipper 是一个 Comonad

    这是对answer https stackoverflow com a 23984628 521070对于我之前的问题 假设我需要映射每个项目a A of List A to b B有功能def f a A leftNeighbors Li
  • 无法在 pgAdmin 4 上查询数据,但可以使用 psql 和 Python

    我在 rds 上创建了一个 postgresql 数据库 我可以在终端上使用 psql 或在 Python 上使用 sqlalchemy 连接和查询它 使用 pgAdmin4 时 我无法查询或可视化数据 但可以创建 更改表 导入数据 我也尝
  • Ruby 错误:“没有这样的文件或目录 -- 脚本/生成 (LoadError)”

    我知道这个错误已经在网络上的其他地方讨论过 这可能看起来是一个愚蠢的问题 但我在这里遇到了一个非常奇怪的情况 我正在 Snow Leopard 上运行 并使用完全更新的 Ruby 和 Rails gem 我使用创建了一个新的 Rails 项
  • 什么是“命名空间清洁度”,glibc 是如何实现的?

    我从以下地方看到这一段 zwol 的回答 https stackoverflow com a 57728805 10795151最近 The libc 前缀于read是因为实际上有三个不同的名称read在 C 库中 read read an
  • 什么是二进制空字符?

    我需要创建 sysDesk 日志文件 在此要求中 我应该创建一个 XML 文件 该文件在元素之间的某些位置包含二进制空字符 有人可以向我解释一下 首先什么是二进制空字符 以及如何将其写入文本文件 我怀疑这意味着 Unicode U 0000
  • 应用程序打开时不显示通知

    应用程序运行时不显示通知 当应用程序关闭时它会起作用 MyFirebaseMessagingService java public class MyFirebaseMessagingService extends FirebaseMessa
  • 即使更改别名后,终端也仅运行 2.7

    如何让终端运行像 manage py 这样的脚本 它将使用 python3 而不是 python2 如果我输入 python 它会运行 python3 但此命令会运行 python2 你的第一行manage py应该 usr bin env
  • Node.js 中的活动句柄是什么

    我发现我的应用程序活动句柄数不断增加 活动句柄的数量究竟是多少 这是我必须注意防止应用程序崩溃的事情吗 活动手柄 句柄是对开放资源 例如打开的文件 数据库连接或请求 的引用 为了理解为什么句柄应该处于关闭状态却可能处于活动状态 我给你一个简
  • 可以在 Spark 批处理上创建模型并在 Spark 流中使用它吗?

    我可以在 Spark Ba tch 中创建模型并将其用于 Spark Streaming 进行实时处理吗 我在 Apache Spark 网站上看到了各种示例 其中训练和预测都是基于相同类型的处理 线性回归 构建的 我可以在 Spark B
  • 使用没有 json 文件的 Google 应用程序默认凭据

    我使用 C 创建了一个控制台应用程序 我使用了谷歌云语音API 我跟着this https github com GoogleCloudPlatform dotnet docs samples tree master speech api
  • 在 Atom 中使用多个游标时有没有办法增加数字?

    我发现自己一遍又一遍地这样做 这可能非常耗时 有哪些选项可用于此 The 增量选择 https atom io packages increment selection包可能就是您正在寻找的 它似乎可以使用多个游标 因此应该非常接近您的用例
  • 获取 DataFrame 的日期时间列的工作日/星期几

    我有一个数据框df如下所示 摘录 时间戳 是索引 Timestamp Value 2012 06 01 00 00 00 100 2012 06 01 00 15 00 150 2012 06 01 00 30 00 120 2012 06
  • 如何在recyclerView中设置可见性小部件

    我有谷歌地图和集群数据 当我单击某个集群时 会显示水平回收器视图 我有 imageButton 它是 CardView 中的下一个或上一个按钮 当我单击它时 cardView 会滚动到下一个位置 它工作完美 但我有一个问题 我的第一个 Ca
  • 如何在 data.frame 中引用 data.frame 的列?

    我有一个名为 series to plot df 的 data frame 它是通过将许多其他 data frame 组合在一起创建的 如下所示 我现在只想从每个列中提取 mm 列 以便我可以绘制它们 所以我想拉出每个 data frame
  • 如何root Genymotion Android 模拟器?

    我已经下载了 Genymotion Android Emulator 供个人使用 我在互联网上搜索以root此设备 论坛说通过adb shell它已经root 同意 Sumits MacBook Pro sdk eSumit adb s 1
  • 模拟Python的内置打印功能

    我试过了 from mock import Mock import builtin builtin print Mock 但这会引发语法错误 我也尝试过像这样修补它 patch builtin print def test somethin
  • 如何按因子生成随机治疗变量?

    Define x lt data frame ID letters 1 10 class as factor c rep 1 5 rep 2 5 treat rep 0 10 s t gt x ID class treat 1 a 1 0
  • javascript 使用 index.js 从“/folder”导入

    我注意到在一些案例中我看到过类似以下内容 reducers reducer1 js export default function reducer1 state action etc reducers reducer2 js export
  • 如何将两个ListView放在一列中?

    我有两个带有 ExpansionTile 的 ListView 我想将它们一个接一个地放在一个列中 该列中首先有一些其他小部件 这是我的代码 override Widget build BuildContext context TODO i
  • 爬行 Android 文件系统陷入可能的 SymLink 循环

    我正在尝试在没有 NIO 的情况下抓取 Android 设备的整个文件系统 包括目录和文件 来构建它的树 如果我有 NIO 那么我可以使用 WalkTree 或类似的 但我没有 我遇到的问题 在 Nexus 5 API 23 x86 模拟器