2

ファイルがフォルダー/シンボリックリンクであるかどうかとそのサイズのみを知る必要がある場合に使用できる、より高速なファイル システム API はありますか。現在、[NSFileManager attributesOfItemAtPath...] を使用しており、NSFileSize と NSFileType のみを使用しています。

使用すべき一括ファイルシステム列挙 API はありますか? ユーザーコードに出入りする必要がなければ、これはより高速になる可能性があると思います。

私の目標は、ディレクトリをすばやく再帰してフォルダーの実際のファイル サイズを取得することです。現在、attributesOfItemAtPath を呼び出しているのが 95% のボトルネックです。

現在使用しているコードの一部:

NSDictionary* properties = [fileManager attributesOfItemAtPath:filePath error:&error];
long long fileSize = [[properties objectForKey:NSFileSize] longLongValue];
NSObject* fileType = [[properties objectForKey:NSFileType isEqual:NSFileTypeDirectory];
4

3 に答える 3

3

さらに詳しく説明すると、Mac OS カーネルは、指定されたディレクトリからファイル属性getdirentriesattr()のリストを返す独自のシステム コールを実装しています。セットアップと呼び出しが面倒で、すべてのファイルシステムでサポートされているわけではありません (!)。

searchfs()ファイルをすばやく検索するために使用できる、密接に関連したシステム コールもあります。それはほとんど同じ落とし穴の対象です。

于 2013-02-27T05:05:51.860 に答える
1

statとを使用できますlstat。ディレクトリサイズの計算については、この回答をご覧ください。
CPU が attributesOfItemAtPath:error で発生します:

于 2013-02-27T04:53:22.047 に答える
1

速いかどうかはわかりませんが、NSURLこの情報は次の方法で提供されますgetResourceValue:forKey:error:

NSError * e;
NSNumber * isDirectory;
BOOL success = [URLToFile getResourceValue:&isDirectory
                                    forKey:NSURLIsDirectoryKey 
                                     error:&e];
if( !success ){
   // error
}

NSNumber * fileSize;
BOOL success = [URLToFile getResourceValue:&fileSize
                                    forKey:NSURLFileSizeKey
                                     error:&e];

エラーがあまり気にならない場合は、これをまとめると便利な場合もあります。

@implementation NSURL (WSSSimpleResourceValueRetrieval)

- (id)WSSResourceValueForKey: (NSString *)key
{
    id value = nil;
    BOOL success = [self getResourceValue:&value
                                   forKey:key 
                                    error:nil];
    if( !success ){
        value = nil;
    }
    
    return value;
}

@end

これは、Dave DeLongが高く評価している古い Cocoa-dev スレッドFSGetCatalogInfo()のソリューションで使用されている非推奨の File Manager 関数の代わりとして提供されます。

列挙の部分については、ファイル システム プログラミング ガイドにセクション「Getting the Contents of a Directory in a Single Batch Operation」があり、使用について説明しています。contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error:

于 2013-02-27T03:47:21.803 に答える