2012-08-14 55 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" 
相關問題