2012-08-14 92 views
2

我正在编写一个实用程序,它在Mac OS X(10.6及更高版本)上遍历目录树,并尝试检测自目录上次与备份位置同步以来发生的更改。是否有任何函数来检索与inode相关联的路径?

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

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

当我遇到一个新的文件或文件夹我首先做一个数据库使用inode编号查找原始文件(如果有的话)。

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

+0

此解决方案是否适合您? – 2018-02-20 17:03:06

+0

@ParagBafna我不再在那个产品上工作,但接受的答案解决了我的问题。 – 2018-02-23 15:16:42

回答

4

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> 

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

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

声明:我只在OS X 10.7上试过,我确信它可以在老系统上运行。我不知道在OS X的未来版本中是否可以依赖此功能。而且它非常适合HFS。

+0

我不能让这对10.6.8工作: ':〜$ LS -id /卷/ Tiland' '32659974 /卷/ Tiland @' ':〜$ LS/.vol/32659974' 'LS:/.vol/32659974:没有这样的文件或directory' ':〜$ CD/.vol/32659974' 'CD:/.vol/32659974:没有这样的文件或directory' 所以,' ls -i'显示音量的inode,但'ls'和'cd'转换为'/ .vol'表示没有任何内容(但他们承认'/ .vol'本身存在) – jetset 2014-09-25 21:59:44

+0

原来的问题是我从ls -i获得的卷的inode号码不能通过/.vol访问,这需要设备ID。当我使用stat获取卷的设备ID时(正如我在这里的答案中看到的那样),它可以工作。 – jetset 2014-09-25 23:08:55

1

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

6

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

GetFileInfo /.vol/234881029/344711 

应该产生:

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

马丁的r答案只能在目录。

+0

'GetFileInfo'不幸已被弃用。 – hendrik 2016-08-31 15:26:39

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" 
相关问题