使用OSX系统调用计算NSURLFileAllocatedSizeKey返回的值

时间:2016-09-21 01:59:47

标签: ios macos posix stat xattr

对于有意义的问题,让我引导您完成整个测试用例,所以请耐心等待。

让我们创建一个文件。

  

echo 0> 〜/样品

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

  

stat -f“%b%Z”〜/ SAMPLE

输出:

  

8 2

正如预期的那样,这个文件分配了8个块,大小为2个字节(Finder中的Get Info告诉我们它是2个字节长,4k在磁盘上,这是8个块*每个块512个字节),所以它是全部好。

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

  

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

让我们再次调用stat:

  

stat -f“%b%Z”〜/ SAMPLE

输出:

  

16 2

添加资源fork属性后,文件系统为该文件分配了16个块。

  

ls -l @〜/ SAMPLE

输出:

  

com.apple.ResourceFork 6

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

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

  

NSURL * url = [NSURL fileURLWithPath:@“〜/ SAMPLE”];

     

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

     

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

     

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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