AutorÃa | Ultima modificación | Ver Log |
/** Copyright 2020 Google LLC** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#import "GoogleDataTransport/GDTCORLibrary/Internal/GDTCORDirectorySizeTracker.h"@interface GDTCORDirectorySizeTracker ()/** The observed directory path. */@property(nonatomic, readonly) NSString *directoryPath;/** The cached content size of the observed directory. */@property(nonatomic, nullable) NSNumber *cachedSizeBytes;@end@implementation GDTCORDirectorySizeTracker- (instancetype)initWithDirectoryPath:(NSString *)path {self = [super init];if (self) {_directoryPath = path;}return self;}- (GDTCORStorageSizeBytes)directoryContentSize {if (self.cachedSizeBytes == nil) {self.cachedSizeBytes = @([self calculateDirectoryContentSize]);}return self.cachedSizeBytes.unsignedLongLongValue;}- (void)fileWasAddedAtPath:(NSString *)path withSize:(GDTCORStorageSizeBytes)fileSize {if (![path hasPrefix:self.directoryPath]) {// Ignore because the file is not inside the directory.return;}self.cachedSizeBytes = @([self directoryContentSize] + fileSize);}- (void)fileWasRemovedAtPath:(NSString *)path withSize:(GDTCORStorageSizeBytes)fileSize {if (![path hasPrefix:self.directoryPath]) {// Ignore because the file is not inside the directory.return;}self.cachedSizeBytes = @([self directoryContentSize] - fileSize);}- (void)resetCachedSize {self.cachedSizeBytes = nil;}- (GDTCORStorageSizeBytes)calculateDirectoryContentSize {NSArray *prefetchedProperties = @[ NSURLIsRegularFileKey, NSURLFileSizeKey ];uint64_t totalBytes = 0;NSURL *directoryURL = [NSURL fileURLWithPath:self.directoryPath];NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager]enumeratorAtURL:directoryURLincludingPropertiesForKeys:prefetchedPropertiesoptions:NSDirectoryEnumerationSkipsHiddenFileserrorHandler:^BOOL(NSURL *_Nonnull url, NSError *_Nonnull error) {return YES;}];for (NSURL *fileURL in enumerator) {@autoreleasepool {NSNumber *isRegularFile;[fileURL getResourceValue:&isRegularFile forKey:NSURLIsRegularFileKey error:nil];if (isRegularFile.boolValue) {totalBytes += [self fileSizeAtURL:fileURL];}}}return totalBytes;}- (GDTCORStorageSizeBytes)fileSizeAtURL:(NSURL *)fileURL {NSNumber *fileSize;[fileURL getResourceValue:&fileSize forKey:NSURLFileSizeKey error:nil];return fileSize.unsignedLongLongValue;}@end