7

現在、このコードを使用してフォルダーのサイズを取得しています。

NSArray *contents;
        NSEnumerator *enumerator;
        NSString *path;
        contents = [[NSFileManager defaultManager] subpathsAtPath:folderPath];
        enumerator = [contents objectEnumerator];
        while (path = [enumerator nextObject]) {
            NSDictionary *fattrib = [[NSFileManager defaultManager] fileAttributesAtPath:[folderPath stringByAppendingPathComponent:path] traverseLink:YES];
            fileSize +=[fattrib fileSize];
        }

        [contents release];
        [path release]; 

問題は、その非常に不正確なことです。実際のサイズから数メガバイトが追加されるか、数メガバイトが差し引かれます。たとえば、.app バンドルのファイル サイズを取得したところ、このメソッドでは 16.2MB と報告されましたが、実際は 15.8MB でした。

フォルダのサイズを取得する最良の方法は何ですか?

ありがとう

4

7 に答える 7

7

私は今日これを自分で行う必要がありました.Cocoa-devリストのこの投稿のコードは非常に高速で、Finderがバイトに言う内容と一致することがわかりました. (kFSCatInfoRsrcSizes フラグで OR することを忘れないでください。そうすれば、リソース フォークのサイズも取得できます!)

使用方法についてさらに説明が必要な場合は、コメントを残してください。この投稿を編集します。=)

于 2009-08-14T04:26:25.687 に答える
4

ドキュメントにfileSizeは、リソース フォークのサイズが含まれていないと記載されています。ディレクトリ サイズを確実に計算するには、 Carbon File Manager APIを使用する必要がある場合があります。

于 2009-08-14T01:48:02.883 に答える
2

これが役立つことを願っています

- (unsigned long long) fastFolderSizeAtFSRef:(NSString *)theFilePath
{
unsigned long long totalSize = 0;
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL  isdirectory;
NSError *error;

if ([fileManager fileExistsAtPath:theFilePath])
{


    NSMutableArray * directoryContents = [[fileManager contentsOfDirectoryAtPath:theFilePath error:&error] mutableCopy];


    for (NSString *fileName in directoryContents)
    {
        if (([fileName rangeOfString:@".DS_Store"].location != NSNotFound) )
            continue;



            NSString *path = [theFilePath stringByAppendingPathComponent:fileName];
            if([fileManager fileExistsAtPath:path isDirectory:&isdirectory] && isdirectory  )
            {

                    totalSize =  totalSize + [self fastFolderSizeAtFSRef:path];



            }
            else
            {
                unsigned long long fileSize = [[fileManager attributesOfItemAtPath:path error:&error] fileSize];
                totalSize = totalSize + fileSize;
            }
    }
}
return totalSize;
}
于 2016-10-14T13:41:09.373 に答える
2

Cocoa-dev の投稿に関する Dave DeLong の提案に賛成したかったのですが、スレッド内のすべての投稿を必ず読むように注意書きを追加しました。特に注目に値するRosynaによるものがあります。私の場合、そのアドバイス (フェッチごとの最大アイテム数を 40 に変更) に従い、速度が向上し、厄介なクラッシュ バグが発生しました。

于 2009-08-14T05:57:05.103 に答える
1

このコードは、NSFileManager クラスの拡張 (カテゴリ) です。すべてのフォルダ コンテンツのサイズを合計します。エラー処理が強化される可能性があることに注意してください。

 @interface NSFileManager(Util)

        - (NSNumber *)sizeForFolderAtPath:(NSString *) source error:(NSError **)error;

    @end

    @implementation NSFileManager(Util)

        - (NSNumber *)sizeForFolderAtPath:(NSString *) source error:(NSError **)error
        {
            NSArray * contents;
            unsigned long long size = 0;
            NSEnumerator * enumerator;
            NSString * path;
            BOOL isDirectory;

            // Determine Paths to Add 
            if ([self fileExistsAtPath:source isDirectory:&isDirectory] && isDirectory) 
            { 
                contents = [self subpathsAtPath:source]; 
            } 
            else 
            { 
                contents = [NSArray array];
            }
            // Add Size Of All Paths 
            enumerator = [contents objectEnumerator]; 
            while (path = [enumerator nextObject]) 
            {
                NSDictionary * fattrs = [self attributesOfItemAtPath: [ source stringByAppendingPathComponent:path ] error:error];
                size += [[fattrs objectForKey:NSFileSize] unsignedLongLongValue]; 
            }
            // Return Total Size in Bytes 

            return [ NSNumber numberWithUnsignedLongLong:size];
        }

        @end
于 2012-12-03T16:48:09.087 に答える
1

これが古いトピックであることは知っています。しかし、これを行う方法についての答えを探している人にとっては、

[[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 が報告する正確なサイズを取得します。

于 2010-01-19T13:17:53.523 に答える
1

これは通常、どのように行われるかです。2 つの可能性:

  1. バイト -> メガバイト変換ルーチンを確認してください。また、メガバイトとメビバイトのどちらが必要ですか? (何と比較するかにもよりますが。)

  2. パラメータに NO を渡してみてtraverseLinkください。バンドルには、比較対象のルーチンが説明できない他の何かを指すシンボリックリンクが含まれている可能性があります。バンドル内の何かを 2 回カウントするか、バンドルの外に何かを完全に含めます (前者の可能性が高い)。

于 2009-08-14T01:46:20.700 に答える