2010-11-16 3 views
2

Я извлекаю размер всех файлов в каталоге документа. Для этого я использую метод attributesOfItemAtPath. Это успешно. Но я получаю вывод в виде байтов и класса NSNumber. Он не выглядит хорошо.Bytes to KiloBytes

Итак, мне нужно получить выходные данные в КБ или МБ, и я должен преобразовать их в NSString, чтобы сохранить это в NSDictionary, поскольку я должен отображать его в TableView. Пожалуйста, помогите мне сделать это. Спасибо.

Вот мой код ..

directoryContent = [[NSMutableArray alloc] init]; 
    for (NSString *path in paths){ 
filesDictionary =[[NSMutableDictionary alloc] init]; 
filesSize = [[NSNumber alloc] init]; 
filesSize = [filesDictionary objectForKey:NSFileSize]; 
filesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:filesSize, @"filesSize", nil]; 
[directoryContent addObject:[filesDictionary copy]]; 
} 

И я использую следующий код, чтобы связать размер в Tableview, который не работает.

cell.lblSize.text = (NSString *) [[directoryContent objectAtIndex:listIndex] objectForKey:@"filesSize"]; 

Помогите мне преобразовать размер файла с байта в KiloByte и отобразить его в таблицеView. Спасибо заранее ..

+2

делим на 1024? –

ответ

5

округляется до ближайшего КБ:

NSNumber *fileSize = [[directoryContent objectAtIndex:listIndex] 
         objectForKey:@"fileSize"]; 
cell.lblSize.text = [NSString stringWithFormat: @"%d", 
        (int)round([fileSize doubleValue]/1024]); 
+0

Спасибо, что так много .. Это работает .. – iOS

0

Рассмотрите возможность использования NSNumber вместо NSString для хранения чисел в NSDictionary.

8

Вы можете использовать мой NSValueTransformer подкласс, если вам нравится:

@interface FileSizeTransformer : NSValueTransformer { 

} 

+ (Class)transformedValueClass; 
+ (BOOL)allowsReverseTransformation; 
- (id)transformedValue:(id)value; 

@end 

@implementation FileSizeTransformer 
+ (Class)transformedValueClass; 
{ 
    return [NSString class]; 
} 

+ (BOOL)allowsReverseTransformation; 
{ 
    return NO; 
} 
- (id)transformedValue:(id)value; 
{ 
    if (![value isKindOfClass:[NSNumber class]]) 
     return nil; 

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

    NSArray *tokens = [NSArray arrayWithObjects:@"B",@"KB",@"MB",@"GB",@"TB",nil]; 

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

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

@end 
+0

Это приятно! Я бы добавил проверку диапазона после цикла while - на всякий случай вы столкнулись с файлом петабайта :) –

+0

Хороший сниппет! Я создал категорию для NSString с ней <3 –

+0

Примечание. Если вы добавляете локализацию в свое приложение, токены не всегда одинаковы. То есть МБ - МО на французском языке. – Daniel