12
12
import Cocoa
13
13
import Kit
14
14
import IOKit. storage
15
+ import CoreServices
15
16
16
17
let kIONVMeSMARTUserClientTypeID = CFUUIDGetConstantUUIDWithBytes ( nil ,
17
18
0xAA , 0x0F , 0xA6 , 0xF9 ,
@@ -38,6 +39,7 @@ internal class CapacityReader: Reader<Disks> {
38
39
private var SMART : Bool {
39
40
Store . shared. bool ( key: " \( ModuleType . disk. stringValue) _SMART " , defaultValue: true )
40
41
}
42
+ private var purgableSpace : [ URL : ( Date , Int64 ) ] = [ : ]
41
43
42
44
public override func read( ) {
43
45
let keys : [ URLResourceKey ] = [ . volumeNameKey]
@@ -96,6 +98,26 @@ internal class CapacityReader: Reader<Disks> {
96
98
}
97
99
98
100
private func freeDiskSpaceInBytes( _ path: URL ) -> Int64 {
101
+ var stat = statfs ( )
102
+ if statfs ( path. path, & stat) == 0 {
103
+ var purgeable : Int64 = 0
104
+ if self . purgableSpace [ path] == nil {
105
+ let value = CSDiskSpaceGetRecoveryEstimate ( path as NSURL )
106
+ purgeable = Int64 ( value)
107
+ self . purgableSpace [ path] = ( Date ( ) , purgeable)
108
+ } else if let pair = self . purgableSpace [ path] {
109
+ let delta = Date ( ) . timeIntervalSince ( pair. 0 )
110
+ if delta > 60 {
111
+ let value = CSDiskSpaceGetRecoveryEstimate ( path as NSURL )
112
+ purgeable = Int64 ( value)
113
+ self . purgableSpace [ path] = ( Date ( ) , purgeable)
114
+ } else {
115
+ purgeable = pair. 1
116
+ }
117
+ }
118
+ return ( Int64 ( stat. f_bfree) * Int64( stat. f_bsize) ) + Int64( purgeable)
119
+ }
120
+
99
121
do {
100
122
if let url = URL ( string: path. absoluteString) {
101
123
let values = try url. resourceValues ( forKeys: [ . volumeAvailableCapacityForImportantUsageKey] )
0 commit comments