2016-09-21 82 views
0

对于有意义的问题,让我指导您完成整个测试用例,请随身携带。使用OSX系统调用计算NSURLFileAllocatedSizeKey返回的值

让我们来创建一个文件。

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 -f "%b %Z" ~/SAMPLE

输出:

16 2

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

ls [email protected] ~/SAMPLE

输出:

com.apple.ResourceFork 6

概括起来:我们加到6个字节到资源叉现在这个文件(添加资源派生之前,从只有8)分配的16个块,具有仅2个字节的内容并且资源分叉具有6个字节。

如果我们运行通过NSURL API这个文件,我们可以得到这样的:

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

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

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

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

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

的NSURLFileSizeKey很简单 - 我们可以只使用ls -l命令,例如,也为NSURLTotalFileAllocatedSizeKey - 我们可以使用从统计(16)块的数量,并通过512乘,但是我们如何得到价值NSURLFileAllocatedSizeKey,在这种情况下是4096?

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

对不起,很长的文章,谢谢!

回答

0

也许NSURLFileAllocatedSizeKey是指只对数据派生分配的空间,就像NSURLFileSizeKey仅指数据派生的大小。

+0

是的,这也是我的想法,但我不知道如何以编程方式获取该信息? – mnovakovic

+0

我只是链接对基金会和使用' - [NSURL getResourceValue:forKey:错误:]' –

+0

因此,不幸的是,我不能这样做,我需要使用一些系统级的API(项目的约束),我只需要实现等效的功能。 – mnovakovic