Search code examples
objective-cmacosinode

Is there any function to retrieve the path associated with an inode?


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.


Solution

  • inode numbers are only unique within a filesystem, so you need at least device and inode number to identify a file.

    On the HFS+ file system, the inode number is in fact identical to the "Macintosh File Id", and there is a special "/.vol" filesystem that allows you to find a directory by device and inode.

    Example:

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

    As you can see, 234881029 is the device number of "/Volumes/Data", 342711 is the inode number of "tmpwork/test20/test20.xcodeproj" within that filesystem, and

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

    transferred you directly to that folder. You could now use getcwd() to determine the real path to that folder.

    The "/.vol" filesystem is documented in the legacy Technical Q&A QA1113.

    Disclaimer: I tried this only on OS X 10.7 and I am fairly sure that it works on older systems. I have no idea if you can rely on this feature in future versions of OS X. Also it is very HFS specific.