如何确定两个路径是Cocoa中同一文件的硬链接?

时间:2014-05-23 15:58:54

标签: cocoa inode hardlink

我需要在运行时为超过255个字符的路径创建文件的硬链接(这是一个令人愤怒的Excel / Word 2011限制的解决方法)。但是由于同一个文件可能会再次打开,我不想重新创建硬链接,如果我已经在我第一次创建它的路径上(我有一个方案来创建这样一个-short-路径使用一个UUID)。这意味着我需要检查已经“缓存”的文件,因为硬链接仍然确实是我为用户打开的文件的硬链接。所以我需要检查两个路径是否是同一文件的硬链接。我发现在测试时存在潜在的竞争条件,但硬链接完全由我的应用程序管理。

2 个答案:

答案 0 :(得分:2)

这是现代的做法:

NSError* error;
id fileID1, fileID2;
if (![url1 getResourceValue:&fileID1 forKey:NSURLFileResourceIdentifierKey error:&error])
    /* handle error */;
if (![url2 getResourceValue:&fileID2 forKey:NSURLFileResourceIdentifierKey error:&error])
    /* handle error */;
if ([fileID1 isEqual:fileID2])
    /* URLs point to the same file (inode) */;

NSURLFileResourceIdentifierKey正是出于此目的。

答案 1 :(得分:0)

我找到了解决方案:

NSDictionary *attr1 = [[NSFileManager defaultManager] attributesOfItemAtPath:url1.path error:NULL];
NSDictionary *attr2 = [[NSFileManager defaultManager] attributesOfItemAtPath:url2.path error:NULL];

NSLog(@"ino1: %@", attr1[NSFileSystemFileNumber]);
NSLog(@"ino2: %@", attr2[NSFileSystemFileNumber]);

 NSLog(@"fs1 : %@", attr1[NSFileSystemNumber]);
 NSLog(@"fs2 : %@", attr2[NSFileSystemNumber]);

如果ino1和ino2相同,并且fs1和fs2相同,则inode是相同的,因此文件是硬链接:

BOOL hardLInks = [ino1 isEqual:ino2] && [fs1 isEqual:fs2];