Размер файла в Snow Leopard - PullRequest
       21

Размер файла в Snow Leopard

1 голос
/ 31 января 2010

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

Размер байта, который я получаю, полностью соответствует размеру байта, как сообщается в Finder, но я не могу понять, как сопоставить размер файла (отображаемый программой Finder в КБ, МБ, ГБ и т. Д.).

Я знаю, что в 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, если я знаю, как его использовать. Я не знаю.

Ответы [ 4 ]

6 голосов
/ 31 января 2010

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

Если в каталоге содержится одна тысяча 1-байтовых файлов, общий размер, занимаемый каталогом, будет

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

хотя число байтов, используемых каталогом, все еще равно

1 * 1000 = 1,000 bytes.
2 голосов
/ 31 января 2010

Вы можете использовать мой 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
2 голосов
/ 31 января 2010

Возможно, вы не измеряете ветку ресурса. Вам нужно будет использовать Диспетчер файлов Core Services как для перебора каталогов, так и для измерения размеров файлов. В отличие от NSFileManager, файловый менеджер сообщит вам размер ветки ресурса.

1 голос
/ 31 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...