Какой API / алгоритм использовать, чтобы соответствовать свободному пространству дисковой утилиты MacOS в High Sierra? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть следующий код 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)")
}
...