2011-12-23 44 views
2

迭代目錄時調用fileAttributes方法的代價是多少?NSDirectoryEnumerator'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; 
} 

,而調用文件管理器似乎浪費,以及因爲我們已經列舉有問題的目錄。

任何見解?

回答

4

在大多數文件系統上,兩種方法都需要同時檢查文件是否存在,並檢查它是否爲目錄,因爲除了目錄條目數據外,還需要訪問inode數據。這相當於每個文件的「stat」調用。

獲取(完整)文件屬性需要另外讀取關於該文件的信息。 inode包含有關文件大小,類型等信息。每個文件屬性調用可能需要額外的IO讀取操作(這裏忽略任何緩存)。

但是,HFS/HFS +是不同的。它的特殊之處在於將文件類型存儲在目錄項(Source Code)中。因此,您可以檢查文件是否是不訪問inode信息的目錄。 NSFileManager的fileExistsAtPath:isDirectory:應該快得多。可能的話,這隻有在涉及數百或數千個文件時纔有意義,但無論如何它都應該更快。

另外,ext4也是similar feature,除非「filetype」標誌被禁用。

相關問題