У меня есть следующий код swift, основанный на документации разработчика здесь
На большинстве систем, которые я пробовал, этот результат совпадает с Disk Utility.Но не все время.Я хочу понять, как Дисковая утилита вычисляет свободное пространство или какой API она использует.
Например, после удаления и очистки из корзины 100 ГБ виртуальных машин VMWare Fusion свободное пространство Дисковой утилиты не обновилось;даже после перезагрузки.Однако выходные данные из API-интерфейсов DiskArbitration обновлены.
Дисковая утилита показывает свободное место на 41,45 ГБ, после удаления и очистки из корзины данных размером 100 ГБ.
В то же время при выводе кода здесь показано, что пространство было очищено:
Available capacity: 115.6 GB
Available capacity for important usage: 149.2 GB
Available capacity for opportunistic usage: 136.8 GB
Total Capacity: 250.7 GB
Program ended with exit code: 0
Пример кода:
import Foundation
import DiskArbitration
// from https://stackoverflow.com/questions/26198073/query-available-ios-disk-space-with-swift
func deviceRemainingFreeSpaceInBytes() -> Int64? {
let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last!
guard
let systemAttributes = try? FileManager.default.attributesOfFileSystem(forPath: documentDirectory),
let freeSize = systemAttributes[.systemFreeSize] as? NSNumber
else {
// something failed
return nil
}
return freeSize.int64Value
}
let fileURL = URL(fileURLWithPath:"/")
do {
let formatter = ByteCountFormatter();
let values = try fileURL.resourceValues(forKeys: [.volumeAvailableCapacityForImportantUsageKey,.volumeAvailableCapacityKey,.volumeAvailableCapacityForOpportunisticUsageKey,.volumeTotalCapacityKey])
if let AvailableCapacity = values.volumeAvailableCapacity {
print("Available capacity: \(formatter.string(fromByteCount:Int64(AvailableCapacity)))")
} else {
print("Capacity is unavailable")
}
if let bytes = deviceRemainingFreeSpaceInBytes() {
print("Free Space on System: \(formatter.string(fromByteCount:bytes))")
} else {
print("failed")
}
if let AvailableCapacityForImportantUsage = values.volumeAvailableCapacityForImportantUsage {
print("Available capacity for important usage: \(formatter.string(fromByteCount:AvailableCapacityForImportantUsage))")
} else {
print("Capacity is unavailable")
}
if let AvailableCapacityForOpportunisticUsage = values.volumeAvailableCapacityForOpportunisticUsage {
print("Available capacity for opportunistic usage: \(formatter.string(fromByteCount:AvailableCapacityForOpportunisticUsage))")
} else {
print("Capacity is unavailable")
}
if let TotalCapacity = values.volumeTotalCapacity {
print("Total Capacity: \(formatter.string(fromByteCount:Int64(TotalCapacity)))")
} else {
print("Capacity is unavailable")
}
} catch {
print("Error retrieving capacity: \(error.localizedDescription)")
}