I\'m trying to figure out how to convert a file\'s (or directory\'s) byte size into kilobytes, megabytes, gigabytes, etc... respectively according the file\'s or directory\'s si
The file is 4 KB because that is the default block size of the HFS+ formatted drive. No file can be smaller than 4 KB. I suspect that is why your directory is a lot more than rounding up to 4 KB, since every smaller file in that directory is already "rounded up" to 4KB chunks, added together the difference may indeed be substantial.
As for your 1,315,291,136-byte showing up as 1.33GB -- is it really a monolithic file? Many files in the finder, for example applications, are actually a directory of many smaller files abstracted in the finder. If you open a contextual menu on the file (right click) do you see "Show Package Contents" as an option?
In HFS+ each file will occupy a multiple of 4,096 bytes (the "block size").
If your directory contains one thousand 1-byte files, the total size occupied by the directory would be
(1000 * 4,096) = 4,096,000 = 4.1 MB,
although the number of bytes used by the directory is still
1 * 1000 = 1,000 bytes.
You can use my NSValueTransformer
subclass if you like:
@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
You're probably not measuring a resource fork. You'll need to use the Core Services File Manager both to iterate the directories and to measure the sizes of files. Unlike NSFileManager, the File Manager will tell you the size of the resource fork.