Если вам нужно получить размер файла одного файла, вы можете сделать это, создав для него URL-адрес файла и напрямую запрашивая атрибуты URL.
NSString *filePath = [@"~/.bash_history" stringByExpandingTildeInPath];
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
NSNumber *fileSizeValue = nil;
NSError *fileSizeError = nil;
[fileURL getResourceValue:&fileSizeValue
forKey:NSURLFileSizeKey
error:&fileSizeError];
if (fileSizeValue) {
NSLog(@"value for %@ is %@", fileURL, fileSizeValue);
}
else {
NSLog(@"error getting size for url %@ error was %@", fileURL, fileSizeError);
}
Если вам нужно перебирать содержимое каталога, как и в вашем вопросе, вы можете сделать URL на основе версии, а также путь в вашем вопросе. Использование contentsOfDirectoryAtPath:...
возвращает массив имен файлов как NSString
с, и вы должны восстановить полный путь и получить атрибуты в качестве дополнительного шага:
NSString *directoryPath = [@"~" stringByExpandingTildeInPath];
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *array = [fm contentsOfDirectoryAtPath: directoryPath error:NULL];
for (NSString *filename in array) {
NSError *attributesError = nil;
NSDictionary *attributes = [fm attributesOfItemAtPath:[directoryPath stringByAppendingPathComponent:filename]
error:&attributesError];
unsigned long long size = [attributes fileSize]; //Note this isn't a pointer
NSLog(@"%llu", size);
}
Вы можете сделать аналогичное решение с помощью файла URL-:
NSString *directoryPath = [@"~" stringByExpandingTildeInPath];
NSURL *directoryURL = [NSURL fileURLWithPath:directoryPath
isDirectory:YES];
NSFileManager *fm = [NSFileManager defaultManager];
NSError *contentsError = nil;
NSArray *contents = [fm contentsOfDirectoryAtURL:directoryURL
includingPropertiesForKeys:@[NSURLFileSizeKey, NSURLIsDirectoryKey]
options:0
error:&contentsError];
if (contents) {
for (NSURL *contentURL in contents) {
NSError *isDirectoryError = nil;
NSNumber *isDirectoryNumber = nil;
[contentURL getResourceValue:&isDirectoryNumber
forKey:NSURLIsDirectoryKey
error:&isDirectoryError];
if (isDirectoryNumber) {
if (![isDirectoryNumber boolValue]) {
NSNumber *fileSizeNumber = nil;
NSError *sizeError = nil;
[contentURL getResourceValue:&fileSizeNumber
forKey:NSURLFileSizeKey
error:&sizeError];
if (fileSizeNumber) {
NSInteger size = [fileSizeNumber integerValue];
NSLog(@"%li", (long)size);
}
else {
NSLog(@"error getting file size for file %@ error:%@",contentURL,sizeError);
}
}
}
else {
NSLog(@"error getting is url %@ was directory: %@", contentURL, isDirectoryError);
}
}
}
else {
NSLog(@"error getting contents for directory %@ error: %@", directoryURL, contentsError);
}
http://stackoverflow.com/questions/1694897/iphone-sdk-see-size-of-local-file-one-created-by-application – Ramz