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