Я написал методы, которые помогают мне получить размер файлов / папок и перевести результат в удобочитаемую строку. Проблема в том, что когда этот размер превышает около 2,1 ГБ, возвращаемое число меняется на случайное отрицательное число, например «-4324234423 байт», что бесполезно.
Что я узнал об этой проблеме и что сделал с ней:
- 32 ГБ ограничен этим размером, поэтому вместо этого я собираю в 64-битной версии.
- Я пытался использовать оба CGFloat и NSUInteger, но оба по-прежнему возвращают то же значение, что и NSInteger.
Я очень расстроен, я не знаю, что мне не хватает. Вот мои методы:
- (NSString *)stringFromFileSize:(int)theSize
{
CGFloat floatSize = theSize;
if (theSize<1023)
return([NSString stringWithFormat:@"%i bytes",theSize]);
floatSize = floatSize / 1024;
if (floatSize<1023)
return([NSString stringWithFormat:@"%1.1f KB",floatSize]);
floatSize = floatSize / 1024;
if (floatSize<1023)
return([NSString stringWithFormat:@"%1.2f MB",floatSize]);
floatSize = floatSize / 1024;
return([NSString stringWithFormat:@"%1.2f GB",floatSize]);
}
- (NSUInteger)sizeOfFile:(NSString *)path
{
NSDictionary *fattrib = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
NSUInteger fileSize = (NSUInteger)[fattrib fileSize];
return fileSize;
}
- (NSUInteger)sizeOfFolder:(NSString*)folderPath
{
NSArray *contents;
NSEnumerator *enumerator;
NSString *path;
contents = [[NSFileManager defaultManager] subpathsAtPath:folderPath];
enumerator = [contents objectEnumerator];
NSUInteger fileSizeInt = 0;
while (path = [enumerator nextObject]) {
NSDictionary *fattrib = [[NSFileManager defaultManager] attributesOfItemAtPath:[folderPath stringByAppendingPathComponent:path] error:nil];
fileSizeInt +=[fattrib fileSize];
}
return fileSizeInt;
}
Чего мне не хватает? NSFileManager возвращает 32-битное значение? Что вызывает это?
Спасибо!