【问题标题】:Is there any function to retrieve the path associated with an inode?是否有任何函数可以检索与 inode 关联的路径?
【发布时间】:2014-09-15 23:16:33
【问题描述】:

我正在编写一个实用程序,它在 Mac OS X(10.6 和更高版本)上遍历目录树,并尝试检测自从目录上次与备份位置同步以来发生的更改。

当我最初同步文件和文件夹时,我会获取 inode 编号并将其存储在该文件或文件夹的数据库记录中:

NSString *oldFilePath = /* ... */;
NSError *error = nil;
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:oldFilePath error:&error];
/* set database record for oldFilePath to [attributes fileSystemFileNumber] */

当我遇到新文件或文件夹时,我首先使用索引节点号进行数据库查找以找到原始文件(如果有)。

但如果文件已从父目录移动到子目录,并且我正在尝试检测对父目录的更改,我希望能够使用保存的 inode 编号来识别新路径这样我就可以区分移动和删除。

【问题讨论】:

  • 这个解决方案适合你吗?
  • @ParagBafna 我不再使用该产品,但接受的答案解决了我的问题。

标签: objective-c macos inode


【解决方案1】:

请注意,如上所述,/.vol/ 'magic' 目录需要卷的设备 ID,以及目录或文件的 inode。您可以将卷的设备 ID 作为stat 返回的第一个数字,如@9​​87654321@ 中所述。

# stat returns device ID as '234881026' and confirms inode is '32659974'
~$ stat /Volumes/Foo
234881026 32659974 lrwxr-xr-x 1 root admin 0 1 ... /Volumes/Foo

# access file using ./vol/<device ID>/<inode>
~$ cd /.vol/234881026/1017800
:../Prague 2011 March$

~$ GetFileInfo /.vol/234881026/1017800/IMG_3731.JPG
file: "/Users/roger/Pictures/Prague 2011 March/IMG_3731.JPG"

【讨论】:

    【解决方案2】:

    在 Mac 上,GetFileInfo 命令执行对 inode 编号的反向查找。

    GetFileInfo /.vol/234881029/344711
    

    应该产生:

    file: "/path/to/file"
    ...
    

    Martin R 的答案仅适用于目录。

    【讨论】:

    • GetFileInfo 很遗憾已被弃用。
    【解决方案3】:

    inode 编号仅在文件系统中是唯一的,因此您至少需要设备 inode 编号来识别文件。

    在 HFS+ 文件系统上,inode 编号实际上与“Macintosh File Id”相同,并且有一个特殊的“/.vol”文件系统允许您通过设备和 inode 查找目录。

    例子:

    $ cd /.vol/234881029/342711
    $ pwd
    /Volumes/Data/tmpwork/test20/test20.xcodeproj
    $ stat .
    234881029 342711 drwxr-xr-x 5 martin staff 0 170 ......
    

    如您所见,234881029 是“/Volumes/Data”的设备编号,342711 是该文件系统中“tmpwork/test20/test20.xcodeproj”的inode 编号,并且

    cd /.vol/<deviceNo>/<inodeNo>
    

    将您直接转移到该文件夹​​。您现在可以使用getcwd() 来确定该文件夹的真实路径。

    “/.vol”文件系统记录在旧版Technical Q&A QA1113 中。

    免责声明:我仅在 OS X 10.7 上尝试过此功能,并且我相当确定它适用于旧系统。我不知道您是否可以在 OS X 的未来版本中依赖此功能。而且它非常特定于 HFS。

    【讨论】:

    • 我无法让它在 10.6.8 上运行::~$ ls -id /Volumes/Tiland32659974 /Volumes/Tiland@:~$ ls /.vol/32659974ls: /.vol/32659974: No such file or directory:~$ cd /.vol/32659974cd: /.vol/32659974: No such file or directory 所以,ls -i 显示卷的 inode ,但是lscd 变成/.vol 说那里什么都没有(但他们承认/.vol 本身存在)
    • 原来问题是我从 ls -i 获取卷的 inode 号,它无法通过 /.vol 访问,它需要设备 ID。当我改为使用 stat 获取卷的设备 ID 时(正如我在此处的答案中看到的那样),它可以工作。
    【解决方案4】:

    在类 Unix 系统上,许多文件名可能引用相同的 inode,因此您必须搜索文件系统。不知道MacOS有没有提供快捷方式。

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 2011-09-23
      • 2019-08-22
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      相关资源
      最近更新 更多