2

I am writing a utility that walks a directory tree on Mac OS X (10.6 and higher) and tries to detect changes that have occurred since the directory was last synchronized with a back-up location.

When I initially synchronize the files and folders I obtain the inode number and store it in the database record for that file or folder:

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

When I encounter a new file or folder I first do a database lookup using the inode number to find the original file, if any.

But in the case where a file has moved from a parent directory to a sub-directory, and I am trying to detect changes to the parent directory I would like to be able to use the saved inode number to identify the new path so that I can distinguish between a move and a delete.

4

4 回答 4

6

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

GetFileInfo /.vol/234881029/344711

应该产生:

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

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

于 2013-10-21T12:36:58.457 回答
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()来确定该文件夹的真实路径。

“/.vol”文件系统记录在旧版技术问答 QA1113中。

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

于 2012-08-14T12:06:45.210 回答
2

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

于 2012-08-14T11:42:31.120 回答
0

请注意,如上所述,/.vol/ 'magic' 目录需要卷的设备 ID,以及目录或文件的 inode。您可以将卷的设备 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"
于 2014-09-25T23:14:06.537 回答