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