Каковы характеристики производительности метода fileAttributes NSDirectoryEnumerator? - PullRequest
2 голосов
/ 24 декабря 2011

Насколько дорого вызывать метод fileAttributes при итерации по каталогу?

В частности, я хотел бы проверить, является ли перечисляемый путь каталогом. Лучше использовать словарь fileAttributes или файловый менеджер? (пример ниже)

NSString *path = "/User/Jack/Documents";
NSDirectoryEnumerator *dirEnum = [filemanager enumeratorAtPath:path];
NSString *file;
BOOL isDir;
while (file = [dirEnum nextObject]) {
    NSLog(@"File: %@", file);
    NSString * p = [path stringByAppendingPathComponent:file];
    BOOL isDir1;
    [[NSFileManager defaultManager] fileExistsAtPath:p isDirectory:&isDir1];
    BOOL isDir2 = [[dirEnum fileAttributes] objectForKey:@"NSFileType"] == NSFileTypeDirectory;
    NSLog(@"isDirectory using fileExistsAtPath:isDirectory: = %d", isDir1);
    NSLog(@"isDirectory using FileAttributes = %d", isDir2);        
}

fileAttributes возвращает тонну «ненужной» информации в дополнение к просто isDirectory, вот пример вывода

2011-12-23 16:17:40.523 App[10190:707] File Attributes: {
    NSFileCreationDate = "2011-10-23 04:04:51 +0000";
    NSFileExtensionHidden = 0;
    NSFileGroupOwnerAccountID = 80;
    NSFileGroupOwnerAccountName = admin;
    NSFileModificationDate = "2011-10-23 04:07:52 +0000";
    NSFileOwnerAccountID = 501;
    NSFileOwnerAccountName = Tony;
    NSFilePosixPermissions = 493;
    NSFileReferenceCount = 6;
    NSFileSize = 204;
    NSFileSystemFileNumber = 8381694;
    NSFileSystemNumber = 234881029;
    NSFileType = NSFileTypeDirectory;
}

Принимая во внимание, что вызов fileManager также кажется расточительным, так как мы уже перечисляем рассматриваемый каталог.

Есть идеи?

1 Ответ

4 голосов
/ 26 декабря 2011

В большинстве файловых систем обоим методам потребуется одно и то же время, чтобы проверить, существует ли файл, и проверить, является ли он каталогом, поскольку в дополнение к данным записи каталога потребуется доступ к данным inode. Это будет эквивалентно вызову " stat " для файла.

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

Однако HFS / HFS + отличается. Особенность в том, что он сохраняет тип файла в записи каталога ( Исходный код ). Следовательно, вы можете проверить, является ли файл каталогом, не обращаясь к информации inode. NSFileManager fileExistsAtPath:isDirectory: должен быть намного быстрее. Возможно, это действительно имеет значение, если задействованы сотни или тысячи файлов, но в любом случае это должно быть быстрее.

Кстати: ext4 также аналогичная функция , если флаг "filetype" не отключен.

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