如何检测 iPhone/iPad 设备上的总可用/空闲磁盘空间?
我正在寻找一种更好的方法来以编程方式检测 iPhone/iPad 设备上的可用/空闲磁盘空间。
目前我正在使用 NSFileManager 来检测磁盘空间。以下是为我完成这项工作的代码片段:
-(unsigned)getFreeDiskspacePrivate {
NSDictionary *atDict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:@"/" error:NULL];
unsigned freeSpace = [[atDict objectForKey:NSFileSystemFreeSize] unsignedIntValue];
NSLog(@"%s - Free Diskspace: %u bytes - %u MiB", __PRETTY_FUNCTION__, freeSpace, (freeSpace/1024)/1024);
return freeSpace;
}
我对上面的片段正确吗?或者是否有更好的方法来了解总可用/空闲磁盘空间。
我必须检测总可用磁盘空间,因为我们必须阻止应用程序在磁盘空间不足的情况下执行同步。
I'm looking for a better way to detect available/free disk space on the iPhone/iPad device programmatically.
Currently I'm using the NSFileManager to detect the disk space. Following is the snippet of the code which does the job for me:
-(unsigned)getFreeDiskspacePrivate {
NSDictionary *atDict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:@"/" error:NULL];
unsigned freeSpace = [[atDict objectForKey:NSFileSystemFreeSize] unsignedIntValue];
NSLog(@"%s - Free Diskspace: %u bytes - %u MiB", __PRETTY_FUNCTION__, freeSpace, (freeSpace/1024)/1024);
return freeSpace;
}
Am I correct with the above snippet? or is there any better way to know total available/free disk space.
I've to detect total free disk space, since we've to prevent our application to perform sync in the low disk space scenario.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(19)
如果您希望使用 Swift 获取剩余的可用空间,则情况略有不同。您需要使用attributesOfFileSystemForPath()而不是attributesOfItemAtPath():
编辑:已更新为Swift 1.0
编辑 2:为了安全起见进行了更新,使用 Martin R 的答案。
编辑 3:针对 Swift 2.0 进行了更新(由 dgellow)
If your looking to get the the remaining free space using Swift it is slightly different. You need to use attributesOfFileSystemForPath() instead of attributesOfItemAtPath():
Edit: Updated for Swift 1.0
Edit 2: Updated for safety, using Martin R's answer.
Edit 3: Updated for Swift 2.0 (by dgellow)
这是我的答案以及为什么它更好。
答案(Swift):
答案(Objective-C):
为什么更好:
NSByteCountFormatter
,这意味着无需进行从字节到千兆字节的疯狂手动计算。苹果为你做到了这一点!NSByteCountFormatter
为您完成此操作。例如,当设备的语言设置为英语时,字符串将读取 248.8 MB,但当设置为法语时,字符串将读取 248,8 Mo,等等其他语言。Here's my answer and why it's better.
Answer (Swift):
Answer (Objective-C):
Why it's better:
NSByteCountFormatter
, meaning no crazy manual calculations from bytes to gigabytes. Apple does this for you!NSByteCountFormatter
does this for you. E.g. When the device's language is set to English the string will read 248.8 MB but will read 248,8 Mo when set to French, et cetera for other languages.您可以使用 Swift 4 和
扩展
找到另一种解决方案,这为您提供了一个不错的选择。这是
UIDevice
扩展。以及示例用法:
You can find an another solution with using Swift 4 and
extension
which gives you a good option.Here is the
UIDevice
extension.And sample usage:
重要的澄清(至少对我来说)。如果我将 iPod 连接到 Mac,这就是 iTunes 应用程序显示的信息。
当我使用上面的代码时:
countStyle NSByteCountFormatterCountStyleFile 向我展示: 17,41 GB
countStyle NSByteCountFormatterCountStyleBinary 显示:16,22 GB
16,22 GB (NSByteCountFormatterCountStyleBinary) 这是当我将 iPod 连接到 Mac 时 iTunes 应用程序显示的完全数字。
Important clarification (at least for me). If I connect my iPod to my Mac this is the info showed by iTunes App.
When I use the above code:
The countStyle NSByteCountFormatterCountStyleFile show me: 17,41 GB
The countStyle NSByteCountFormatterCountStyleBinary show me: 16,22 GB
16,22 GB (NSByteCountFormatterCountStyleBinary) It is EXACTLY the number that iTunes App show me when I connect my iPod to my Mac.
这是
FileManager
的 Swift 5 扩展,具有正确的错误处理功能,并且没有自动字符串转换(根据您的喜好将字节计数转换为字符串)。也遵循FileManager
的命名。用法示例:
Here is Swift 5 extension for
FileManager
with proper error handling and no automatic string conversions (convert byte count to string as you prefer). Also followsFileManager
's naming.Example usage:
对于 iOS >= 6.0,您可以使用新的
NSByteCountFormatter
。此代码获取格式化字符串中剩余的可用字节数。For iOS >= 6.0 you can use the new
NSByteCountFormatter
. This code gets the number of free bytes remaining as a formatted string.以下代码是 ChrisJF 之前提供的答案的 Swift 3.0 版本实现:
Following code is Swift 3.0 version implementation of the answer previously provided by ChrisJF:
对于 Swift 作为 UIDevice 扩展
如何使用:
输出将是:
for Swift as UIDevice extension
How to use:
Output will be:
我知道这篇文章有点旧,但我认为这个答案可以帮助某人。如果您想了解设备上已用/可用/总磁盘空间,可以使用 Luminous。它是用 Swift 编写的。您只需致电:
或
I know this post is a bit old, but I think this answer can help someone. If you want to know the used/free/total disk space on the device you can use Luminous. It's written in Swift. You have only to call :
or
上述代码的快速实现:-
从任何其他类调用它。
测试返回值时,与其他应用程序显示的值相同。至少在我的 iPhone 6S+ 上是这样。这只是上面显示的答案的快速实现。对我来说,接受的答案不起作用。
Swift implementation of above code:-
Call it from any other class.
While testing the returned value, it's same as shown by other apps. At least in my iPhone 6S+. It's just the swift implementation of the above shown answer. And for me the accepted answer didn't work.
我创建了这样一个扩展。在大多数情况下,它可以满足所有需求。
Apple 文件系统的路径指定正确。
I created such an extension. In most cases, it covers all needs.
The path is specified correct for Apple File System.
ChrisJF 在 Swift 2.1 版本中的回答:
ChrisJF answer in Swift 2.1 version:
如果您想节省时间,请使用以下 CocoaPod 库。我没有使用它,但看起来应该有用。
https://cocoapods.org/pods/SystemServices
If you want to save time, use the following CocoaPod Library. I didn't used it but seems like it should work.
https://cocoapods.org/pods/SystemServices
更新:由于此答案和添加新方法/API 后已经过去了很长时间,请检查下面针对 Swift 等的更新答案;由于我自己没有使用过它们,所以我不能保证它们。
原始答案:
我发现以下解决方案对我有用:
它返回的大小与设备连接到计算机时 iTunes 显示的大小完全相同。
UPDATE: Since a lot of time has passed after this answer and new methods/APIs have been added, please check the updated answers below for Swift etc; Since I've not used them myself, I can't vouch for them.
Original answer:
I found the following solution working for me:
It returns me exactly the size that iTunes displays when device is connected to machine.
使用 unsigned long long 修改源:
编辑:似乎有人编辑了此代码以使用“uint64_t”而不是“unsigned long long”。虽然在可预见的将来这应该没问题,但它们并不相同。 'uint64_t' 是 64 位,并且将永远是 64 位。 10年后“unsigned long long”可能是128。这是一个小问题,但为什么我使用unsignedLongLong。
Revised source using unsigned long long:
EDIT: it seems someone edited this code to use 'uint64_t' instead of 'unsigned long long'. While in the foreseeable future this should be just fine, they are not the same. 'uint64_t' is 64 bits and will always be that. In 10 years 'unsigned long long' might be 128. its a small point but why I used unsignedLongLong.
我已经编写了一个类来使用 Swift 获取可用/已用内存。
演示地址:https://github.com/thanhcuong1990/swift-disk-status< br>
斯威夫特 4 更新。
演示
I have written a class to get available/used memory using Swift.
Demo at: https://github.com/thanhcuong1990/swift-disk-status
Swift 4 updated.
Demo
如果您需要具有大小的格式化字符串,您可以查看 GitHub 上的不错的库< /a>:
If you need formatted string with size you can take a look at nice library on GitHub:
使用新的准确 API 进行更新,以获取 iOS11 中可用的磁盘大小。
以下是新 API 资源密钥的描述:
我交叉比较了密钥“FileAttributeKey.systemFreeSize”和密钥“URLResourceKey.volumeAvailableCapacityForImportantUsageKey”的结果,发现返回的结果是表单“volumeAvailableCapacityForImportantUsageKey”与 UI 上显示的可用存储空间完全匹配。
这是快速实施:
Update with a new accurate API to get available size on disk available in iOS11.
Here is the description for the new API resource key:
I cross compared the results from key "FileAttributeKey.systemFreeSize" and key "URLResourceKey.volumeAvailableCapacityForImportantUsageKey" and found the results returned form "volumeAvailableCapacityForImportantUsageKey" exactly matches the available storage shown on UI.
Here is the swift implementation:
不要使用“unsigned”,它只有 32 位,会溢出超过 4GB,这小于典型的 iPad/iPhone 可用空间。使用 unsigned long long (或 uint64_t),并使用 unsignedLongLongValue 从 NSNumber 中检索作为 64 位 int 的值。
Don't use 'unsigned', it is only 32 bits which will overflow past 4GB, which is less than the typical iPad/iPhone free space. Use unsigned long long (or uint64_t), and retrieve the value out of the NSNumber as a 64-bit int too using unsignedLongLongValue.