1

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

4

2 回答 2

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正是为此目的而制造的。

于 2014-05-24T09:04:11.383 回答
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];
于 2014-05-23T15:58:53.583 回答