我正在尝试获取目录的大小以及使用Swift在OS X上的内容。到目前为止,我只能获得目录本身的大小,而没有内容。对于我的大多数目录,它通常显示6148个字节的值,但它的确有所不同。
我已经尝试了下面文件中的directorySize()函数,但它也返回了6,148个字节。
https://github.com/amosavian/ExtDownloader/blob/2f7dba2ec1edd07282725ff47080e5e7af7dabea/Utility.swift
我尝试了该问题的前2个答案,但不确定将Swift传递给Objective-C函数所需的参数。我相信它需要一个指针(我是学习的入门程序员)。
我正在使用Xcode 7.0并运行OS X 10.10.5。
更新: Xcode 11.4.1•Swift 5.2
extension URL { /// check if the URL is a directory and if it is reachable func isDirectoryAndReachable() throws -> Bool { guard try resourceValues(forKeys: [.isDirectoryKey]).isDirectory == true else { return false } return try checkResourceIsReachable() } /// returns total allocated size of a the directory including its subFolders or not func directoryTotalAllocatedSize(includingSubfolders: Bool = false) throws -> Int? { guard try isDirectoryAndReachable() else { return nil } if includingSubfolders { guard let urls = FileManager.default.enumerator(at: self, includingPropertiesForKeys: nil)?.allObjects as? [URL] else { return nil } return try urls.lazy.reduce(0) { (try $1.resourceValues(forKeys: [.totalFileAllocatedSizeKey]).totalFileAllocatedSize ?? 0) + $0 } } return try FileManager.default.contentsOfDirectory(at: self, includingPropertiesForKeys: nil).lazy.reduce(0) { (try $1.resourceValues(forKeys: [.totalFileAllocatedSizeKey]) .totalFileAllocatedSize ?? 0) + $0 } } /// returns the directory total size on disk func sizeOnDisk() throws -> String? { guard let size = try directoryTotalAllocatedSize(includingSubfolders: true) else { return nil } URL.byteCountFormatter.countStyle = .file guard let byteCount = URL.byteCountFormatter.string(for: size) else { return nil} return byteCount + " on disk" } private static let byteCountFormatter = ByteCountFormatter() }
用法:
do { let documentDirectory = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false) if let sizeOnDisk = try documentDirectory.sizeOnDisk() { print("Size:", sizeOnDisk) // Size: 3.15 GB on disk } } catch { print(error) }