【问题标题】:Why are there more files/hardlinks with the same iNode than the reference count shows?为什么具有相同 iNode 的文件/硬链接比引用计数显示的多?
【发布时间】:2009-08-25 16:44:05
【问题描述】:

我在单个卷上递归了一个文件夹,并检索了文件名、引用计数和 inode 编号的列表,使用

NSFileManager attributesOfItemAtPath

和 NSDictionary fileSystemFileNumber 和 objectForKey:NSFileReferenceCount

由于某种原因,我得到的结果是引用计数为 10,但列表中有超过 10 个具有相同 iNode 编号的文件。

值得注意的是,我的列表中没有包含 SymLink,我只在 [dict fileType] == NSFileTypeRegular 时记录一个文件

任何想法为什么会出现这种情况?

编辑:@Peter Hosey,我正在编写 iNode 和引用计数,如下所示:

CLMFileManagedObj *clmf;
clmf = (CLMFileManagedObj *)[NSEntityDescription insertNewObjectForEntityForName:@"CLMFile" inManagedObjectContext:moc];

NSUInteger fsfn = [dict fileSystemFileNumber];
[clmf setValue:[NSNumber numberWithUnsignedInteger:fsfn] forKey:@"iNodeNumber"];
[clmf setValue:(NSNumber*)[dict objectForKey:NSFileReferenceCount] forKey:@"referenceCount"];

请注意,iNodeNumber 和 referenceCount 的写法略有不同的原因是 [dict] 提供了直接 (NSUInteger)fileSystemFileNumber 获取方法,而 fileReferenceCount 需要使用键检索(根据我在 NSDictionary 上找到的任何帮助) )

CLMFile 实体的两个属性都是 Int 64。据我所知,NSUInteger 的类型取决于运行 32 位还是 64 位模式,但 [NSNumber numberWithUnsignedInteger] 接受 NSUInteger 作为参数,所以我假设它处理在任一模式下正确输入号码。

我看不到活动监视器中的哪个位置显示它是否为 32/64 位。我会假设 XCode 3.1.3 项目的默认设置是什么。

我可能在这里遗漏了一些东西,因为我对 Mac/Obj-C/XCode/Cocoa 比较陌生,所以任何帮助/指针将不胜感激。经验丰富的程序员,但不在这种环境中(尽管我学习得尽可能快......)

【问题讨论】:

  • 如何打印 inode,您的应用程序是否运行 64 位? (您可以通过查看活动监视器来判断后者。)
  • @Peter:感谢您查看此内容-我已更新问题以提供更多详细信息。仍然无法确定在哪里确定它是否在 64 位模式下运行,除非 Kind:Intel 提供线索?
  • “英特尔”是 32 位的。 “英特尔(64 位)”是 64 位的。所以你在你的 UI 中显示这些数字?
  • 是的,只需使用在 Interface Builder 窗口中下拉的标准核心数据实体列表样式视图。

标签: objective-c cocoa macos hfs


【解决方案1】:

您是否在查看 Time Machine 备份?是否涉及目录硬链接?

如果目录 A 包含硬链接的目录 B1 和 B2,则具有相同 inode 的文件将在 B1 和 B2 中,但引用计数可能为 1。

【讨论】:

  • 嗯,好点子 - 我以为没有目录硬链接,但我会检查一下......
  • 就是这样 - 具有相同 inode 的文件列表的数量大于 ref 计数,文件所在的所有文件夹的 inode 数量与文件 inode 的 ref 计数相同.谢谢
猜你喜欢
  • 2014-07-03
  • 2017-09-10
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
相关资源
最近更新 更多