【问题标题】:Calculating the value returned by NSURLFileAllocatedSizeKey using OSX system calls使用 OSX 系统调用计算 NSURLFileAllocatedSizeKey 返回的值
【发布时间】:2016-09-21 01:59:46
【问题描述】:

为了让问题有意义,让我引导你完成整个测试用例,所以请耐心等待。

让我们创建一个文件。

echo 0 > ~/SAMPLE

这会生成一个大小为 2 字节的简单文件(echo 默认会追加新行,这不会影响示例)。

stat -f "%b %Z" ~/SAMPLE

输出:

8 2

正如预期的那样,这个文件分配了 8 个块,大小为 2 个字节(在 Finder 中获取信息告诉我们,它是 2 个字节长,磁盘上 4k,即 8 个块 * 512 个字节/块),所以这就是全部不错。

现在让我们添加一个属性,特别是一个资源分支:

xattr -w com.apple.ResourceFork 000000 ~/SAMPLE

让我们再次调用 stat:

stat -f "%b %Z" ~/SAMPLE

输出:

16 2

添加resource fork属性后,文件系统为这个文件分配了16个block。

ls -l@ ~/SAMPLE

输出:

com.apple.ResourceFork 6

总结一下:我们在资源分叉中添加了 6 个字节,这个文件现在分配了 16 个块(在添加资源分叉之前只有 8 个),内容只有 2 个字节,并且资源叉有 6 个字节。

如果我们通过 NSURL API 运行这个文件,我们会得到:

NSURL *url = [NSURL fileURLWithPath:@"~/SAMPLE"];

[url getResourceValue:&size forKey:NSURLFileSizeKey error:nil]; // 输出:2

[url getResourceValue:&size forKey:NSURLFileAllocatedSizeKey error:nil]; // 输出:4096

[url getResourceValue:&size forKey:NSURLTotalFileAllocatedSizeKey error:nil]; // 输出:8192

所以我的问题是,如果只使用系统调用(bash 或系统 API),我们如何获得 4096,即 NSURLFileAllocatedSizeKey 键的结果?

NSURLFileSizeKey 很简单——例如,我们可以只使用 ls -l,也可以用于 NSURLTotalFileAllocatedSizeKey——我们可以使用 stat (16) 中的块数并乘以 512,但是我们如何获得 的值NSURLFileAllocatedSizeKey,在这种情况下是4096?

据我了解,如果我们要删除资源分叉属性,它将是 NSURLFileAllocatedSizeKey 键返回的值,但是我们如何使用系统 API 或 bash 获取该值?

【问题讨论】:

    标签: ios macos posix stat xattr


    【解决方案1】:

    也许 NSURLFileAllocatedSizeKey 仅指为数据叉分配的空间,就像 NSURLFileSizeKey 仅指数据叉的大小。

    【讨论】:

    • 是的,我也是这么想的,但我不确定如何以编程方式获取该信息?
    • 我只是链接到 Foundation 并使用 -[NSURL getResourceValue:forKey:error:]
    • 所以很遗憾我不允许这样做,我需要使用一些系统级的API(项目的约束),我只需要实现等效的功能。
    • 也许统计资源分叉并从文件的总块数中减去它的块数?
    • 也试过了,~/SAMPLE 和 ~/SAMPLE/..namedfork/rsrc 的块数相同 - 都是 16 :(
    猜你喜欢
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2012-03-10
    • 2014-12-10
    • 2012-05-07
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多