NSDirectoryEnumerator的fileAttributes方法的性能特征是什么?

时间:2011-12-23 21:19:58

标签: performance cocoa filesystems

在迭代目录时调用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);        
}
除了isDirectory之外,

fileAttributes还会返回大量“不必要的”信息,这里是一个示例输出

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 个答案:

答案 0 :(得分:4)

在大多数文件系统上,两种方法都需要花费相同的时间来检查文件是否存在,并检查它是否是目录,因为除了目录条目数据之外还需要访问inode数据。这相当于每个文件的“stat”调用。

获取(完整)文件属性需要另外读取有关该文件的信息。 inode包含有关文件大小,类型等的信息。每个文件属性调用可能需要额外的IO读取操作(此处忽略任何高速缓存)。

然而,HFS / HFS +是不同的。它的特殊之处在于将文件类型存储在目录条目(Source Code)中。因此,您可以检查文件是否是目录而不访问inode信息。 NSFileManager的fileExistsAtPath:isDirectory:应该快得多。可能,这只涉及数百或数千个文件才真正重要,但无论如何它应该更快。

BTW:除非禁用“filetype”标志,否则ext4也是similar feature