是否有任何函数来检索与inode关联的路径?

时间:2012-08-14 11:29:55

标签: objective-c macos inode

我正在编写一个实用程序,它在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编号来标识新路径这样我就可以区分移动和删除。

4 个答案:

答案 0 :(得分:6)

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

GetFileInfo /.vol/234881029/344711

应该产生:

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

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

答案 1 :(得分:4)

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()来确定该文件夹的真实路径。

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

免责声明:我只在OS X 10.7上试过这个,我相当确定它适用于较旧的系统。我不知道你是否可以在未来的OS X版本中依赖这个功能。它也非常适合HFS。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

请注意,如上所述,/。vol /'magic'目录需要卷的设备ID以及目录或文件的inode。您可以按照different answer here中的说明获取该卷的设备ID作为stat返回的第一个号码。

# 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"