2010-01-31 3 views
1

Я пытаюсь выяснить, как преобразовать размер байта файла (или каталога) в килобайты, мегабайты, гигабайты и т. Д. Соответственно в соответствии с размером файла или каталога, так что это соответствует тому, что Finder отображается на панели при нажатии «Получить информацию».Размер файла в Snow Leopard

Размер байта. Я получаю полностью совпадающий размер байта, как сообщается в Finder, но я не могу понять, как получить размер файла (как показано Finder в KB, MB, GB и т. Д.) Для соответствия.

Я знаю, что в 10.6 мы используем базу 10, поэтому килобайт составляет 1000 байт, а не 1024, но деление количества байтов на 1000 (или 1000^2, 1000^3 и т. Д.) Не соответствует тому, что сообщает Finder ,

Например, в Finder: текстовый файл в 330 байтов отображается как файл размером 4 КБ (поэтому первоначальное предположение было бы округлять все размеры файлов до 4 Кбайт), но 389,022-байтный каталог отображается как 418 КБ (путь больше, чем округление до 4 КБ, поэтому я думаю, что это неправильно). Также файл размером 1,315,291,136 байт отображается как 1,33 ГБ.

Так может ли кто-нибудь быть таким добрым, чтобы пролить свет здесь? Как рассчитываются эти цифры? Я посмотрел вокруг и не смог найти ответ.

Заранее благодарим за вашу помощь!

P.S. Я всегда был на 100% ориентирован на какао, так как я начал программировать, и я никогда раньше не использовал каркас Carbon (я знаю, что он очень мощный, я просто не знаю, как его использовать). Я упоминаю об этом на всякий случай, если кто-то захочет дать мне решение Carbon, предполагая, что я знаю, как его использовать. Я не.

ответ

1

Файл имеет размер 4 КБ, поскольку это размер блока по умолчанию для форматированного диска HFS +. Файл не может быть меньше 4 КБ. Я подозреваю, поэтому ваш каталог намного больше, чем округление до 4 Кбайт, поскольку каждый более мелкий файл в этом каталоге уже «округлен» до 4 Кбайт, добавленный вместе, разница может действительно быть существенной.

Что касается вашего 1,315,291,136-байта, отображаемого как 1,33 ГБ - это действительно монолитный файл? Многие файлы в finder, например приложения, на самом деле являются каталогами меньших файлов, абстрагированных в поисковике. Если вы откроете контекстное меню в файле (щелкните правой кнопкой мыши), вы видите «Показать содержимое пакета» в качестве опции?

6

В HFS + каждый файл займет несколько 4096 байт («размер блока»).

Если каталог содержит одну тысячу 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> ([лексемы Count] -1)) {вернуться @» Huge! ";}' Перед этим окончательным оператором return.В противном случае, если файл очень большой (или число, которое вы преобразовываете, неверно), возникает исключение «индекс за пределами границ». – Mason