Objective c 是否有任何函数可以检索与inode关联的路径?

Objective c 是否有任何函数可以检索与inode关联的路径?,objective-c,macos,inode,Objective C,Macos,Inode,我正在编写一个实用程序,它在Mac OS X(10.6及更高版本)上遍历目录树,并尝试检测自上次将目录与备份位置同步以来发生的更改 最初同步文件和文件夹时,我获取inode编号并将其存储在该文件或文件夹的数据库记录中: NSString *oldFilePath = /* ... */; NSError *error = nil; NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:o

我正在编写一个实用程序,它在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编号进行数据库查找,以查找原始文件(如果有的话)


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

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

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

在HFS+文件系统上,inode编号实际上与“Macintosh文件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是“/卷/数据”的设备号,342711是该文件系统中“tmpwork/test20/test20.xcodeproj”的索引节点号,以及

cd /.vol/<deviceNo>/<inodeNo>
cd/.vol//
将您直接转到该文件夹。现在可以使用
getcwd()
确定该文件夹的实际路径

“/.vol”文件系统记录在遗留文件中


免责声明:我只在OSX10.7上尝试过这个,而且我相当确信它可以在较旧的系统上运行。我不知道您是否可以在未来版本的OS X中依赖此功能。而且它非常特定于HFS。

在Mac上,GetFileInfo命令执行索引节点编号的反向查找

GetFileInfo /.vol/234881029/344711
应产生:

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

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

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

#stat返回设备ID为“234881026”,并确认inode为“32659974”
~$stat/Volumes/Foo
234881026 32659974 lrwxr-xr-x 1根管理员0 1/卷/富
#使用/vol访问文件//
约$cd/.vol/234881026/1017800
:../2011年3月布拉格$
~$GetFileInfo/.vol/234881026/1017800/IMG_3731.JPG
文件:“/Users/roger/Pictures/Prague 2011年3月/IMG_3731.JPG”

我无法在10.6.8上实现此功能:
:~$ls-id/Volumes/Tiland
32659974/Volumes/Tiland@
:~$ls/.vol/32659974
ls:/.vol/32659974:没有这样的文件或目录
:~$cd/.vol/32659974
cd:/.vol/32659974:没有这样的文件或目录
ls-i
显示卷的inode,但是
ls
cd
进入
/.vol
表示那里什么都没有(但他们承认
/.vol
本身存在),问题是我从ls-i获取卷的inode编号,无法通过/vol访问,它需要设备ID。当我使用stat获取卷的设备ID时(正如我在这里的回答中所看到的),它可以工作。
GetFileInfo
不幸地被弃用。这个解决方案适合您吗?@parabafna我不再使用该产品,但接受的回答解决了我的问题。
# 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"