web-dev-qa-db-ja.com

Cocoaでファイルサイズを適切に取得してMB、GBに変換する方法は?

可能性のある複製:
サイズを人間が読み取れる文字列に変換するためのObjC/Cocoaクラス?

Cocoaは初めてです。フォルダーファイルのサイズを適切に取得しようとしています。 1 GB未満の場合はMBで表示し、GBで表示します。

表示する方法は、ポイントの後に1つの数字で丸められます。

5.5 MB1000を超える場合>1.1 GB

私はこれを使用しようとしています

 unsigned  long long size= ([[[NSFileManager defaultManager] attributesOfItemAtPath:fullPath error:nil] fileSize]);

しかし、私が望むように、数値を適切に変換して表示することはできません。

ありがとう。

43
User1234

ファイルサイズをMBに変換するには、Gbは以下の関数を使用します

- (id)transformedValue:(id)value
{

    double convertedValue = [value doubleValue];
    int multiplyFactor = 0;

    NSArray *tokens = @[@"bytes",@"KB",@"MB",@"GB",@"TB",@“PB”, @“EB”, @“ZB”, @“YB”];

    while (convertedValue > 1024) {
        convertedValue /= 1024;
        multiplyFactor++;
    }

    return [NSString stringWithFormat:@"%4.2f %@",convertedValue, tokens[multiplyFactor]];
}

編集:

NSByteCountFormatter クラスを使用することもできます。 iOS 6.0/OS X v10.8以降で利用可能です。

[NSByteCountFormatter stringFromByteCount:1999 countStyle:NSByteCountFormatterCountStyleFile];

CountStyleでは、NSByteCountFormatterCountStyleFileNSByteCountFormatterCountStyleMemoryNSByteCountFormatterCountStyleDecimal、またはNSByteCountFormatterCountStyleBinaryを使用できます。

NSByteCountFormatterCountStyleFile:ファイルまたはストレージのバイト数の表示を指定します。これの実際の動作はプラットフォーム固有です。 OS X 10.8では、これは10進数スタイルを使用しますが、時間の経過とともに変化する可能性があります。

NSByteCountFormatterCountStyleMemory:メモリのバイト数の表示を指定します。これの実際の動作はプラットフォーム固有です。 OS X 10.8では、これはバイナリスタイルを使用しますが、時間の経過とともに変化する可能性があります。

NSByteCountFormatterCountStyleDecimal:KBのバイト数を明示的に指定します。1000バイトは1 KBとして表示されます

NSByteCountFormatterCountStyleBinary:KBのバイト数を明示的に指定します。1024バイトは1 KBとして表示されます

115
Parag Bafna

OS X 10.8またはiOS 6をターゲットにしている場合、 NSByteCountFormatter を使用できます。

私はあなたの例を次のように書きます:

    NSError *error = nil;
    NSDictionary *attribs = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:&error];
    if (attribs) {
        NSString *string = [NSByteCountFormatter stringFromByteCount:[attribs fileSize] countStyle:NSByteCountFormatterCountStyleFile];
        NSLog(@"%@", string);
    }
57
jrc