当前位置: 首页 > 面试题库 >

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

宓诚
2023-03-14
问题内容

我正在尝试使用来获取可用的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更新

在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
}

Swift 2.1更新:

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
}

Swift 3.0更新:

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")
}


 类似资料:
  • 问题内容: 基本上,我需要输出,其中包括可用空间和卷的总大小。该解决方案需要在Windows,Linux和Mac上运行并使用Go编写。 我浏览了和Go文档,但没有发现任何东西。在Windows上,即使命令行实用程序也很笨拙()或需要提升的特权()。当然有一种方法我还没有发现… 更新: 根据nemo的回答和邀请,我提供了一个跨平台的Go软件包来执行此操作。 问题答案: 在POSIX系统上,可以使用。

  • 问题内容: 消息1101,级别17,状态10,第12行由于文件组“ DEFAULT”中的磁盘空间不足,无法为数据库“ TEMPDB”分配新页。通过在文件组中放置对象,将其他文件添加到文件组或为文件组中的现有文件设置自动增长来创建必要的空间。 用普通的英语是什么意思。 问题答案: 我发现,TempDB爆炸式增长的正常原因是查询,无论是临时查询还是存储过程查询,该查询中都有意外的多对多联接,有人将其称

  • 本文向大家介绍使用什么命令查看磁盘使用空间? 空闲空间呢?相关面试题,主要包含被问及使用什么命令查看磁盘使用空间? 空闲空间呢?时的应答技巧和注意事项,需要的朋友参考一下 答案: df -hl 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% Mounted on /dev/hda2 45G 19G 24G 44% / /dev/hda1

  • 问题内容: 我正在尝试输出文件系统上的可用磁盘空间量。 如果我运行该命令,则可以通过以人为本并实际查看它来获得有关可用磁盘空间(以kb为单位)的良好信息。 我需要获取这些数据,并在我的shell脚本中的其他地方使用它。我最初考虑使用,但后来我的脚本无法移植到其他磁盘上,因为可用磁盘空间会发生变化,剪切将不会产生准确的结果。 如何仅获得示例的可用磁盘空间(以kb为单位)的输出? 问题答案: 要获取以

  • 我使用Grafana(v2.1.3)进行指标可视化。指标来自Graphite收集的Collectd。目标图是以百分比显示多个节点的空闲磁盘空间,例如,让文件夹 /data,所以以字节表示空闲空间的度量是: 表示总空间的度量是以下各项的总和: 因此,我有以下配置: 这里的$节点是从下拉列表(All,node1,node2,node3等)中选择的变量。当选择一个特定的节点时,它会按预期工作,但选择了错

  • 本文向大家介绍SQL Server获取磁盘空间使用情况,包括了SQL Server获取磁盘空间使用情况的使用技巧和注意事项,需要的朋友参考一下 对于DBA来说,监控磁盘使用情况是必要的工作,然后没有比较简单的方法能获取到磁盘空间使用率信息,下面总结下这些年攒下的脚本: 最常用的查看磁盘剩余空间,这个属于DBA入门必记的东西: xp_fixeddrives方式有点是系统自带,可直接使用,缺点是不能查