2014-05-23 25 views
1

我需要在運行時創建長度超過255個字符的文件的硬鏈接(這是真正的Excel/Word 2011限制的解決方法)。但是由於同一個文件可能會在以後再次打開,我不想重新創建硬鏈接,如果我已經在第一次創建它的路徑中創建它(我有一個使用a創建這種-short-路徑的方案UUID)。這意味着我需要檢查已經「緩存」的文件,因爲硬鏈接仍然是我爲用戶打開的文件的硬鏈接。所以我需要檢查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正好爲這個目的的。

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]; 
+1

Inodes('NSFileSystemFileNumber')在給定的捲上只是唯一的。您還應該比較'NSFileSystemNumber'給出的卷號,以確保您擁有相同的文件。 – CRD

+0

好點,CRD,謝謝! – charles

相關問題