deep-linking-sample/Apps/Wikipedia/WMF Framework/NSFileManager+DirectorySize.swift
Javier Cicchelli 9bcdaa697b [Setup] Basic project structure (#1)
This PR contains all the work related to setting up this project as required to implement the [Assignment](https://repo.rock-n-code.com/rock-n-code/deep-linking-assignment/wiki/Assignment) on top, as intended.

To summarise this work:
- [x] created a new **Xcode** project;
- [x] cloned the `Wikipedia` app and inserted it into the **Xcode** project;
- [x] created the `Locations` app and also, its `Libraries` package;
- [x] created the `Shared` package to share dependencies between the apps;
- [x] added a `Makefile` file and implemented some **environment** and **help** commands.

Co-authored-by: Javier Cicchelli <javier@rock-n-code.com>
Reviewed-on: rock-n-code/deep-linking-assignment#1
2023-04-08 18:37:13 +00:00

37 lines
1.5 KiB
Swift

import Foundation
@objc public extension FileManager {
@objc func sizeOfDirectory(at url: URL) -> Int64 {
var size: Int64 = 0
let prefetchedProperties: [URLResourceKey] = [.isRegularFileKey, .fileAllocatedSizeKey, .totalFileAllocatedSizeKey]
if let enumerator = self.enumerator(at: url, includingPropertiesForKeys: prefetchedProperties) {
for item in enumerator {
guard let itemURL = item as? NSURL else {
continue
}
let resourceValueForKey: (URLResourceKey) -> NSNumber? = { key in
var value: AnyObject? = nil
try? itemURL.getResourceValue(&value, forKey: key)
return value as? NSNumber
}
guard let isRegularFile = resourceValueForKey(URLResourceKey.isRegularFileKey)?.boolValue else {
continue
}
guard isRegularFile else {
continue
}
let fileSize = resourceValueForKey(URLResourceKey.totalFileAllocatedSizeKey) ?? resourceValueForKey(URLResourceKey.fileAllocatedSizeKey)
guard let allocatedSize = fileSize?.int64Value else {
assertionFailure("URLResourceKey.fileAllocatedSizeKey should always return a value")
return size
}
size += allocatedSize
}
}
return size
}
}