2012-08-14 1 views
2

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 번호를 사용하여 새 디렉토리를 식별 할 수 있기를 바랍니다 경로를 사용하여 이동과 삭제를 구별 할 수 있습니다.

+0

이 솔루션은 잘 작동합니까? –

+0

@ParagBafna 더 이상 해당 제품을 사용하지 않고 있지만 답변을 통해 문제가 해결되었습니다. ': –

답변

4

inode 번호는 파일 시스템 내에서만 고유하므로 파일을 식별하려면 최소한 inode 번호가 필요합니다.

HFS + 파일 시스템에서 inode 번호는 실제로 "Macintosh 파일 ID"와 동일하며 장치 및 inode별로 디렉토리를 찾을 수있는 특별한 "/.vol"파일 시스템이 있습니다.

예 :

$ cd /.vol/234881029/342711 
$ pwd 
/Volumes/Data/tmpwork/test20/test20.xcodeproj 
$ stat . 
234881029 342711 drwxr-xr-x 5 martin staff 0 170 ...... 

당신이 볼 수 있듯이, 234,881,029은의 장치 번호입니다 "/ 볼륨/데이터", 342711 그 파일 시스템 내에서 "tmpwork/test20/test20.xcodeproj"의 아이 노드 번호입니다, 및

cd /.vol/<deviceNo>/<inodeNo> 

그 폴더로 바로 전송됩니다. 이제 getcwd()을 사용하여 해당 폴더의 실제 경로를 확인할 수 있습니다.

"/.vol"파일 시스템은 레거시 Technical Q&A QA1113에 설명되어 있습니다.

면책 조항 :이 문제는 OS X 10.7에서만 발생했지만 이전 시스템에서는 정상적으로 작동합니다. 나는 당신이 OS X의 차기 버전에서이 기능을 의지 할 수 있는지 잘 모른다. 또한 매우 HFS에 특화되어있다.

+0

나는이 10.6.8에서 동작하지 않습니다 ~ $ 1! -id/볼륨/Tiland' '32659974/볼륨/Tiland @' ': ~ $ LS/.vol/32659974' 'LS : /.vol/32659974 : 해당 파일 또는 directory' ': ~ $의 CD/.vol/32659974' 'CD : /.vol/32659974 : 해당 파일 또는 그래서 directory' ' ls -i'는 볼륨에 대한 아이 노드를 보여줍니다. 그러나'ls'와'cd .'는'/ .vol'에 아무 것도 없다고 말합니다 (그러나 그들은'/.vol' 자체가 존재한다는 것을 인정합니다). – jetset

+0

문제가 나옵니다. 장치 ID가 필요한 /.vol를 통해 액세스 할 수없는 ls -i에서 볼륨의 inode 번호를 얻는 중입니다. 대신에 stat를 사용하여 볼륨의 장치 ID를 얻었을 때 (여기에 나온 답변 에서처럼) 작동합니다. – jetset

1

유닉스 계열 시스템에서 많은 파일 이름이 동일한 아이 노드를 참조 할 수 있으므로 파일 시스템을 검색해야합니다. MacOS에서 지름길을 제공하는지 모르겠습니다.

6

Mac의 경우 GetFileInfo 명령은 inode 번호의 역방향 조회를 수행합니다.

GetFileInfo /.vol/234881029/344711 

는 생산해야 :

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

마틴 R의 대답은 디렉토리에서 작동합니다.

+0

'GetFileInfo'는 불행하게도 더 이상 사용되지 않습니다. – hendrik

0

위에서 설명한대로 /.vol/ 'magic'디렉토리에는 볼륨의 장치 ID와 디렉토리 또는 파일의 inode가 필요합니다. different answer here에 설명 된대로 stat에 의해 반환 된 첫 번째 번호로 볼륨의 장치 ID를 가져올 수 있습니다.

# 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" 
관련 문제