Fork me on GitHub

Swift中的文件管理-NSFileManager

写在前面

由于 iOS 系统不开放的原因,用户是不可以进行文件操作的。在代码层面,应用程序都是运行在自己的沙盒中,我们只能在当前应用目录下进行文件操作。

沙盒机制

iOS应用程序只能对自己创建的文件系统读取文件,这个独立、封闭、安全的空间,叫做沙盒。它一般存放着程序包文件(可执行文件)、图片、音频、视频、plist文件、sqlite数据库以及其他文件。

模拟器沙盒的位置/User/userName/Library/Application Support/iPhone Simulator

目录结构

默认情况下,每个应用的目录结构如下图所示:
document

目录 是否同步到iTunes 说明 使用场景
Documents 最常用目录,适合存储重要数据 不可再生的用户数据
Library/Caches 常用目录,适合存储缓存文件和数据 可再生的缓存图片、数据,==清除缓存就是清除这里的数据==
Library/Preferences 通常保存应用的偏好设置信息 NSUserDefaults
tmp 存放临时数据,应用退出或者手机重启后会删除文件 临时数据

NSFileManager

NSFileManager是文件管理的对象,在使用的时候,我们通常使用了系统提供的方法:NSFileManager.defaultManager(),系统的方法获取了一个单例对象,线程安全的。如果在不同线程中使用,而且需要代理函数来监听事件,这时候要使用init来创建每个线程独立的fileManager。

通过NSFileManager获取目录和文件创建、读写、删除、重命名等操作,具体的操作可以参考Apple官方文档 。接下来介绍几个常用的方法。

获取路径

在项目中我们通常要缓存数据需要进行存放,这个时候Library/Caches文件目录就起到了非常重要的作用。通常使用这个方法来进统一获取这个目录,进行缓存的管理。

1
2
3
public class func yfCachesURL() -> NSURL {
return try! NSFileManager.defaultManager().URLForDirectory(.CachesDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
}

缓存

我们通常需要在项目中显示缓存的大小,只获取缓存的图片方法并不完整,使用以下遍历Library/Caches文件得出的缓存大小比较准确。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class func cachesSize() -> Float {
let files = NSFileManager.defaultManager().subpathsAtPath(cacheURLStrng())
var size: Float = 0
for fileName in files!{
let path = cacheURLStrng().stringByAppendingFormat("/\(fileName)")
let floder = try! NSFileManager.defaultManager().attributesOfItemAtPath(path)
for (abc, bcd) in floder {
if abc == NSFileSize {
size += bcd.floatValue
}
}
}
return size/(1024*1024)
}

另外常用操作进行缓存的清除,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class func cleanCachesDirectoryAtURL(cachesDirectoryURL: NSURL) {
let fileManager = NSFileManager.defaultManager()
if let fileURLs = (try? fileManager.contentsOfDirectoryAtURL(cachesDirectoryURL, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions())) {
for fileURL in fileURLs {
do {
try fileManager.removeItemAtURL(fileURL)
} catch _ {
yfLog.error("Clean Caches - removeItemAtURL: \(fileURL) error!")
}
}
}
}


版权声明



Ivan’s Blog by Ivan Ye is licensed under a Creative Commons BY-NC-ND 4.0 International License.
叶帆创作并维护的叶帆的博客博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于Ivan’s Blog | 叶帆的博客博客( http://yeziahehe.com ),版权所有,侵权必究。

本文链接:http://yeziahehe.com/2016/08/05/Swift_NSFileManager/