Проблема с размером файла - Какао - PullRequest
1 голос
/ 18 октября 2010

Я написал методы, которые помогают мне получить размер файлов / папок и перевести результат в удобочитаемую строку. Проблема в том, что когда этот размер превышает около 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-битное значение? Что вызывает это?

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 октября 2010

Увы, почти все системы имеют 32-битное значение int, даже если вы компилируете для 64-битного. (Windows, Mac и Linux работают таким образом). Смотри http://en.wikipedia.org/wiki/64-bit#Specific_C-language_data_models.

Вы можете либо передать long своему stringFromFileSize методу, либо передать NSUInteger.

0 голосов
/ 20 сентября 2013

Немного поздно, но вы можете использовать эту единственную строку с правильным форматером чисел:

NSString *fileSizeStr = [NSByteCountFormatter stringFromByteCount:fileSize countStyle:NSByteCountFormatterCountStyleFile]; 
...