Простой способ получить размер папки (ObjC/Cocoa)?

Лучшее определение, которое я нашел до сих пор, один James Shore :

"Внедрение зависимости" является термином за 25 долларов для понятия за 5 центов. [...] Внедрение зависимости означает давать объекту свои переменные экземпляра. [...].

существует статья Martin Fowler , который может оказаться полезным, также.

Внедрение зависимости в основном обеспечивает объекты, в которых объект нуждается (его зависимости) вместо того, чтобы иметь его создают их сам. Это - очень полезная техника для тестирования, так как это позволяет зависимостям дразниться или гаситься.

Зависимости могут быть введены в объекты многими средствами (такими как инжекция конструктора или инжекция метода set). Можно даже использовать специализированные платформы внедрения зависимости (например, Spring), чтобы сделать это, но они, конечно, не требуются. Вам не нужны те платформы, чтобы иметь внедрение зависимости. Инстанцирование и передача объектов (зависимости) явно являются столь же хорошей инжекцией как инжекция платформой.

7
задан indragie 14 August 2009 в 01:37
поделиться

5 ответов

Мне нужно было сделать это сегодня самому, и я обнаружил, что код в этой публикации в списке Cocoa-dev очень быстрый и соответствует тому, что Finder говорит байт. (не забудьте выполнить ИЛИ в флаге kFSCatInfoRsrcSizes, чтобы получить размеры вилки ресурсов!)

Если вам нужно больше объяснений, как его использовать, просто оставьте комментарий, и я отредактирую этот пост. =)

6
ответ дан 6 December 2019 в 11:51
поделиться

Документация для fileSize заявляет, что он не включает размер вилки ресурса. Возможно, вам потребуется использовать Carbon File Manager API для надежного расчета размеров каталогов.

4
ответ дан 6 December 2019 в 11:51
поделиться

Я просто хотел поддержать предложение Дэйва ДеЛонга о публикации на Cocoa-dev, но добавить предостережение, чтобы обязательно прочитать все сообщения в ветке. Особого внимания заслуживает одна работа Розины. В моем случае я последовал этому совету (изменив максимальное количество элементов на выборку до 40) и увидел скачок скорости, а также конец неприятной ошибки, вызывающей сбой.

2
ответ дан 6 December 2019 в 11:51
поделиться

Обычно это делается так. 2 возможности:

  1. Проверьте свои процедуры преобразования байтов в мегабайты. Кроме того, вам нужны мегабайты или мебибайты? (Вероятно, это зависит от того, с чем вы его сравниваете.)

  2. Попробуйте передать NO для параметра traverseLink . В пакете вполне может быть символическая ссылка, указывающая на что-то еще, что процедура, с которой вы ее сравниваете, не будет учитывать. Вы либо дважды посчитаете что-то в пакете, либо полностью включите что-то вне пакета (скорее всего, первое).

1
ответ дан 6 December 2019 в 11:51
поделиться

Я знаю, что это старая тема. Но для всех, кто ищет ответы на то, как это сделать,

[[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir];
        if (isDir) {
            NSPipe *pipe = [NSPipe pipe];
            NSTask *t = [[[NSTask alloc] init] autorelease];
            [t setLaunchPath:@"/usr/bin/du"];
            [t setArguments:[NSArray arrayWithObjects:@"-k", @"-d", @"0", path, nil]];
            [t setStandardOutput:pipe];
            [t setStandardError:[NSPipe pipe]];

            [t launch];

            [t waitUntilExit];

            NSString *sizeString = [[[NSString alloc] initWithData:[[pipe fileHandleForReading] availableData] encoding:NSASCIIStringEncoding] autorelease];
            sizeString = [[sizeString componentsSeparatedByString:@" "] objectAtIndex:0];
            bytes = [sizeString longLongValue]*1024;
        }
        else {
            bytes = [[[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil] fileSize];
        }

Это будет использовать терминал для определения размера для папок в байтах. И это будет использовать Cocoa встроенные в NSFilemanager, чтобы получить размер файлов. Это очень быстро, и получает точный размер, которые доклады Finder.

1
ответ дан 6 December 2019 в 11:51
поделиться