【问题标题】:How do I determine that two paths are hard links to the same file in Cocoa?如何确定两个路径是指向 Cocoa 中同一个文件的硬链接?
【发布时间】:2014-07-13 01:52:29
【问题描述】:

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

【问题讨论】:

    标签: cocoa inode hardlink


    【解决方案1】:

    这是现代的做法:

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

    【讨论】:

      【解决方案2】:

      我找到了解决办法:

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

      【讨论】:

      • 索引节点 (NSFileSystemFileNumber) 仅在给定卷上是唯一的。您还应该比较NSFileSystemNumber 给出的卷号,以确保您拥有相同的文件。
      猜你喜欢
      • 2013-03-17
      • 2012-07-12
      • 1970-01-01
      • 2012-11-16
      • 2011-08-26
      • 2021-08-06
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多