// // PSDirectorySizeOperation.m // Perforce // // Created by Adam Czubernat on 29/05/14. // Copyright (c) 2014 Perforce Software, Inc. All rights reserved. // #import "PSDirectorySizeOperation.h" @interface PSDirectorySizeOperation () { NSArray *paths; void (^block)(long long size, NSInteger count); } @end @implementation PSDirectorySizeOperation + (id)operationWithPath:(NSString *)path block:(void (^)(long long, NSInteger))block { return [[self alloc] initWithPath:path block:block]; } + (id)operationWithPaths:(NSArray *)paths block:(void (^)(long long, NSInteger))block { return [[self alloc] initWithPaths:paths block:block]; } - (id)initWithPath:(NSString *)path block:(void (^)(long long, NSInteger))completionBlock { return [self initWithPaths:@[ path ] block:completionBlock]; } - (id)initWithPaths:(NSArray *)array block:(void (^)(long long, NSInteger))completionBlock { if (self = [super init]) { paths = array; block = [completionBlock copy]; } return self; } - (void)main { NSInteger count = 0; long long size = 0; NSFileManager *filemanager = [NSFileManager defaultManager]; for (NSString *path in paths) { if ([self isCancelled]) break; BOOL dir; if (![filemanager fileExistsAtPath:path isDirectory:&dir]) continue; count++; if (!dir) { size += [[filemanager attributesOfItemAtPath:path error:NULL] fileSize]; continue; } NSDirectoryEnumerator *enumerator; enumerator = [filemanager enumeratorAtURL:[NSURL fileURLWithPath:path isDirectory:YES] includingPropertiesForKeys:@[ NSURLTotalFileSizeKey, NSURLIsHiddenKey ] options:0 errorHandler:NULL]; for (NSURL *url in enumerator) { NSNumber *fileSize, *hidden; [url getResourceValue:&fileSize forKey:NSURLTotalFileSizeKey error:NULL]; [url getResourceValue:&hidden forKey:NSURLIsHiddenKey error:NULL]; size += fileSize.longLongValue; if (!hidden.boolValue) count++; if ([self isCancelled]) break; }; } dispatch_async(dispatch_get_main_queue(), ^{ if (block && ![self isCancelled]) block(size, count); block = nil; }); } - (void)cancel { [super cancel]; block = nil; } @end