2010-01-31 23 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