【发布时间】: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