2010-01-31 60 views
1

我想知道如何根据文件或目录的大小分别将文件(或目录)的字节大小转换为千字节,兆字节,千兆字节等,以便匹配当您点击“获取信息”时,Finder将在面板中显示。Snow Leopard中的文件大小

我得到的字节大小与Finder中报告的字节大小完全一致,但我无法弄清楚如何获得文件大小(如Finder所显示的KB,MB,GB等)以匹配。我知道在10.6我们使用base 10,所以千字节是1000字节而不是1024,但是将字节数除以1000(或1000^2,1000^3等)与Finder报告的不一致。

例如,在Finder中:330字节的文本文件显示为4KB文件(因此我最初的猜测是将所有文件大小舍入为4KB数字),但是389,022字节的目录显示为一个418KB(比四舍五入至4KB的方式更多,所以我的猜测是错误的)。还有一个1,315,291,136字节的文件显示为1.33GB。

那么任何人都可以请这么友善地在这里摆脱一些光?这些数字是如何计算的?我四处寻找,一直未能找到答案。

在此先感谢您的帮助!

P.S.自从我开始编程以来,我一直是100%Cocoa的,我从来没有使用Carbon框架(我知道它非常强大,我只是不知道如何使用它)。我提到这一点,以防万一任何人想要给我一个碳解决方案,假设我知道如何使用它。我不。

回答

1

该文件是4 KB,因为这是HFS +格式化驱动器的默认块大小。没有文件可以小于4 KB。我怀疑这就是为什么你的目录远不止四舍五入到4 KB,因为那个目录中的每个较小的文件已经“四舍五入”到4KB块,加起来这个差别可能确实很大。

至于你的1,315,291,136字节显示为1.33GB - 它真的是一个单一的文件?查找器中的许多文件(例如应用程序)实际上都是查找器中抽象的许多较小文件的目录。如果您打开文件上的上下文菜单(右键单击),您是否看到“Show Package Contents”作为选项?

6

在HFS +中,每个文件将占用4,096个字节(“块大小”)的倍数。

如果您目录包含千1字节的文件,由目录所占用的总规模将

(1000 * 4,096) = 4,096,000 = 4.1 MB, 

但由目录使用的字节数仍然

1 * 1000 = 1,000 bytes. 
2

您可能没有测量资源分支。您需要使用the Core Services File Manager来迭代目录并测量文件的大小。与NSFileManager不同,文件管理器会告诉你资源分支的大小。

2

如果你喜欢,你可以用我NSValueTransformer子类:

@interface FileSizeTransformer : NSValueTransformer { 

} 

+ (Class)transformedValueClass; 
+ (BOOL)allowsReverseTransformation; 
- (id)transformedValue:(id)value; 

@end 

@implementation FileSizeTransformer 
+ (Class)transformedValueClass; 
{ 
    return [NSString class]; 
} 

+ (BOOL)allowsReverseTransformation; 
{ 
    return NO; 
} 
- (id)transformedValue:(id)value; 
{ 
    if (![value isKindOfClass:[NSNumber class]]) 
     return nil; 

    double convertedValue = [value doubleValue]; 
    int multiplyFactor = 0; 

    NSArray *tokens = [NSArray arrayWithObjects:@"B",@"KB",@"MB",@"GB",@"TB",nil]; 

    while (convertedValue > 1024) { 
     convertedValue /= 1024; 
     multiplyFactor++; 
    } 

    return [NSString stringWithFormat:@"%4.2f %@",convertedValue, [tokens objectAtIndex:multiplyFactor],value]; 
} 

@end 
+1

虽然在大多数情况相当不可能的,你可能要加上'如果(multiplyFactor>([令牌计数] -1)){返回@”巨大!“;}'在最后的回报声明之前。否则,如果一个文件非常大(或者你正在转换的数字是错误的),则会引发“索引越界”异常。 – Mason 2012-01-24 04:59:27