Как определить общее, доступное и используемое пространство USB-накопителя в Swift (MacOS)?
Об этом есть несколько хороших сообщений (пример: Как получить общее дисковое пространство и свободное дисковое пространство с помощью AttributesOfFileSystemForpaths в swift 2.0 и https://developer.apple.com/documentation/foundation/urlresourcekey/checking_volume_storage_capacity), но все они просто занимают место на диске операционной системы, а не на USB-накопителе.
Например, у меня есть USB-накопитель емкостью 64 ГБ с именем тома myusb, поэтому MacOS монтирует диск в /Volumes/myusb. Finder показывает общее пространство USB-накопителя как 62,91 ГБ, доступное как 62,29 ГБ и используемое как 625 999 872 байта.
Проблема, похоже, в том, что когда я указываю путь к USB-накопителю, поскольку он, очевидно, является частью основного / пути, он возвращает информацию для /, который является моим диском ОС, а не USB-накопитель.
Вот что я делаю, когда пытаюсь определить свободное место на USB-накопителе и возвращает значение 292298430687 байт (это доступное пространство на диске моей ОС, а не на USB-накопителе):
/**
Returns URL of root of USB drive - i.e. /Volumes/myusb
Uses bundleURL as .app file being executed is located on the USB drive
*/
static func getRootURL() -> URL {
let bundlePath = Bundle.main.bundleURL
let bundlePathComponents = bundlePath.pathComponents
let destinationRootPathURL = URL(fileURLWithPath: bundlePathComponents[0])
.appendingPathComponent(bundlePathComponents[1])
.appendingPathComponent(bundlePathComponents[2])
return destinationRootPathURL
}
/**
returns free space of USB drive
*/
func getAvailableSpaceInBytes() -> Int64 {
if #available(OSX 10.13, *) {
if let freeSpace = try? getRootURL().resourceValues(forKeys: [URLResourceKey.volumeAvailableCapacityForImportantUsageKey])
.volumeAvailableCapacityForImportantUsage {
return freeSpace
}
} else {
// Fallback on earlier versions
guard let systemAttributes = try? FileManager.default.attributesOfFileSystem(forPath: getRootURL().path),
let freeSize = systemAttributes[FileAttributeKey.systemFreeSize] as? NSNumber
else {
// something failed so return nil
return 0
}
return freeSize.int64Value
}
return 0
}