使用Swift查询可用的iOS磁盘空间

我正在尝试使用来获取可用的iOS设备存储Swift

        func deviceRemainingFreeSpaceInBytes() -> NSNumber {

let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

let systemAttributes = NSFileManager.defaultManager().attributesOfFileSystemForPath(documentDirectoryPath.last as String, error: nil)

return systemAttributes[NSFileSystemFreeSize] as NSNumber

}

但是在编译时会给出此错误:[NSObject : AnyObject]? does not have a member named

'subscript'我相信此错误是由此处提到的问题引起的,即attributesOfFileSystemForPath返回可选的字典(文档)。我从一般意义上理解了这个问题,但是由于建议的解决方案涉及一个嵌套的情况,所以我不太了解如何修复我感兴趣的功能(这对我来说还很陌生Swift)。有人可以建议如何使功能起作用吗?注意:我不确定原始功能是否由作者测试过,或者是否在xcode

6 beta下运行,但是就我所知,它在GM下不起作用。

回答:

回答:

在iOS

11下,下面给出的答案不再提供准确的结果。可以传递新的卷容量键,以URL.resourceValues(forKeys:)提供与设备设置中可用值匹配的值。

  • static let volumeAvailableCapacityKey: URLResourceKey 卷的可用容量的键(以字节为单位)(只读)。

  • static let volumeAvailableCapacityForImportantUsageKey: URLResourceKey 卷的可用容量(以字节为单位)的键,用于存储重要资源(只读)。

  • static let volumeAvailableCapacityForOpportunisticUsageKey: URLResourceKey 卷的可用容量(以字节为单位)的键,用于存储非必需资源(只读)。

  • static let volumeTotalCapacityKey: URLResourceKey 卷总容量的键(以字节为单位)(只读)。

从Apple的文档中:

总览

在尝试在本地存储大量数据之前,请先验证您是否具有足够的存储容量。为了获得卷的存储容量,您可以构造一个URL(使用URL实例),该URL引用要查询的卷上的对象,然后查询该卷。

确定要使用的查询类型

使用的查询类型取决于要存储的内容。如果您要根据用户请求或应用程序正常运行所需的资源来存储数据(例如,用户即将观看的视频或游戏中下一关所需的资源),请查询volumeAvailableCapacityForImportantUsageKey。但是,如果您以更具预测性的方式下载数据(例如,下载用户最近一直在观看的电视连续剧的最新剧集),请查询volumeAvailableCapacityForOpportunisticUsageKey

构造查询

使用此示例作为指导来构造您自己的查询:

let fileURL = URL(fileURLWithPath: NSHomeDirectory() as String)

do {

let values = try fileURL.resourceValues(forKeys: [.volumeAvailableCapacityForImportantUsageKey])

if let capacity = values.volumeAvailableCapacityForImportantUsage {

print("Available capacity for important usage: \(capacity)")

} else {

print("Capacity is unavailable")

}

} catch {

print("Error retrieving capacity: \(error.localizedDescription)")

}


回答:

可选绑定if let这里也适用。

我建议该函数返回一个optional Int64,以便它可以返回 nil以表示失败:

func deviceRemainingFreeSpaceInBytes() -> Int64? {

let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)

if let systemAttributes = NSFileManager.defaultManager().attributesOfFileSystemForPath(documentDirectoryPath.last as String, error: nil) {

if let freeSize = systemAttributes[NSFileSystemFreeSize] as? NSNumber {

return freeSize.longLongValue

}

}

// something failed

return nil

}

func deviceRemainingFreeSpaceInBytes() -> Int64? {

let documentDirectory = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last!

guard

let systemAttributes = try? NSFileManager.defaultManager().attributesOfFileSystemForPath(documentDirectory),

let freeSize = systemAttributes[NSFileSystemFreeSize] as? NSNumber

else {

// something failed

return nil

}

return freeSize.longLongValue

}

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

}

用法:

if let bytes = deviceRemainingFreeSpaceInBytes() {

print("free space: \(bytes)")

} else {

print("failed")

}

以上是 使用Swift查询可用的iOS磁盘空间 的全部内容, 来源链接: utcz.com/qa/429594.html

回到顶部