ios沙盒机制
sandbox.png沙盒包括3个文件夹及app程序打包的目录
- Document:程序创建或应用浏览产生的文件数据,当我们的iphone备份或恢复的时候会把这个文件目录包含进去(类似android的data/data/包名)
- Library:程序默认设置或状态信息保存在该目录(类似android的首选项之类)
- tem:提供一个即时创建临时文件的地方,但不需要持久化,应用关闭之后就可能被删除或系统在程序不运行时,会帮助我们清楚掉(类似android中缓冲ACache类似sd卡、或应用专享目录storage/emulated/0/Android/data/app_package_name/files与cache目录)
获取沙盒路径
//获取home 目录
func home()->String{
let homeDirectory = NSHomeDirectory()
//NSLog("沙盒目录home=%d", homeDirectory) //这样仅仅是打印内存地址
NSLog("沙盒目录home=%@", homeDirectory)//用@才能打印字符
return homeDirectory
}
比如我的到的结果是
2017-09-15 20:24:53.037 FileOperator[14203:2895999] 沙盒目录home=/Users/younghare/Library/Developer/CoreSimulator/Devices/AE55D945-8254-4DCB-B07F-EB1F7A2B70DB/data/Containers/Data/Application/C4115CEF-C30F-4762-8BA0-3456549DF722
在mac中打开finder/前往/前往文件夹
也就是说在mac中查看iphone中存储的文件其实就是用finder工具就可以。android需要借助ddms或adb命令(初次接触ios,如果描述的不对,请各位指正一二)
forwordToFolder2.png获取Documents目录
func getDocumentsPath()->String{
//方法1
//第一个参数:指定了搜索的路径名称
//第2个参数:限定了在沙盒内部
var documentPaths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,
FileManager.SearchPathDomainMask.userDomainMask, true)
let documentPath = documentPaths[0]
NSLog("沙盒目录Document=%@", documentPath)//用@才能打印字符
//方法2
//let ducumentPath2 = NSHomeDirectory() + "/Documents"
return documentPath
}
获取沙盒下Library的目录
//获取沙盒下Library的目录
func getLibrary()->String{
// //Library目录-方法1
let libraryPaths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.libraryDirectory,
FileManager.SearchPathDomainMask.userDomainMask, true)
let libraryPath = libraryPaths[0]
// //Library目录-方法2
// let libraryPath2 = NSHomeDirectory() + "/Library"
//
//
// //Cache目录-方法1
// let cachePaths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory,
// FileManager.SearchPathDomainMask.userDomainMask, true)
// let cachePath = cachePaths[0]
//
// //Cache目录-方法2
// let cachePath2 = NSHomeDirectory() + "/Library/Caches"
NSLog("沙盒目录Library=%@", libraryPath)//用@才能打印字符
// NSLog("沙盒目录Library=%@", cachePath)//用@才能打印字符
return libraryPath
}
获取tmp目录
func getTmpPath()->String{
//方法1
let tmpDir = NSTemporaryDirectory()
//方法2
// let tmpDir2 = NSHomeDirectory() + "/tmp"
NSLog("沙盒目录tmp=%@", tmpDir)//用@才能打印字符
//方法2
return tmpDir
}
iOS 文件操作
一般用于本地化数据(仅涉及基本的文件读写进行开发)
- 图片处理
- 个性化信息处理
- 共用信息分享
- 网络数据缓冲
轻量型关系数据库,不在此范畴。
涉及的主要类
-FileHandle类主要对文件内容进行读取和写入操作
FileManager类主要对文件的操作(删除、创建)
URL 文件路径拼接等操作
String 、NSArray、Data可以直接用write方法写入文件
获取FileManager实例
func getFileManager()->FileManager{
return FileManager.default
}
在app沙盒的document中创建一个文件夹
func createFolder(_ dir: String)->Bool{
let fullDir = getDocumentsPath()+"/"+dir
let fileManager = getFileManager()
do{
try fileManager.createDirectory(at: NSURL(fileURLWithPath: fullDir, isDirectory: true) as URL, withIntermediateDirectories: true, attributes: nil)
}catch{
NSLog("文件夹创建成失败")
return false
}
print("文件夹创建成成功")
return true
}
创建文件,并写入内容
func createFile(name:String, fileBaseUrl:URL)->Bool{
let manager = FileManager.default
let file = fileBaseUrl.appendingPathComponent(name)
print("文件: \(file)")
let exist = manager.fileExists(atPath: file.path)
if !exist {
let data = Data(base64Encoded:"aGVsbG8gd29ybGQ=" ,options:.ignoreUnknownCharacters)
let createSuccess = manager.createFile(atPath: file.path,contents:data,attributes:nil)
print("文件创建结果: \(createSuccess)")
}
return true
}
在document目录创建文件
let manager = FileManager.default
let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)
let url = urlForDocument[0] as URL
createFile(name: "帮助说明.txt",fileBaseUrl: url)
app程序打包的目录(类似android系统中的/data/app/*.apk)
简单说明:工程打包安装后会在NSBundle.mainBundle()路径下,该路径是只读的,不允许修改。
所以当我们工程中有一个SQLite数据库要使用,在程序启动时,我们可以把该路径下的数据库拷贝一份到Documents路径下,以后整个工程都将操作Documents路径下的数据库。
iOS app安装目录
获取 app程序打包安装的目录Bundle
//获取 app程序打包安装的目录Bundle
func getBundlePath()->String{
let appInstallPath = Bundle.main.bundlePath
NSLog("app程序打包安装的目录Bundletmp=%@", appInstallPath)//用@才能打印字符
return appInstallPath
}
copy app程序打包安装的目录younghareDB.sqlite到document目录
//copy app程序打包安装的目录younghareDB.sqlite到document目录
func copySqliteFileToDocument()->String{
//声明一个Documents下的路径
let dbPath = NSHomeDirectory() + "/Documents/hanggeDB.sqlite"
//判断数据库文件是否存在
if !FileManager.default.fileExists(atPath: dbPath){
//获取安装包内数据库路径
let bundleDBPath:String? = Bundle.main.path(forResource: "younghareDB", ofType: "sqlite")
//将安装包内数据库拷贝到Documents目录下
try! FileManager.default.copyItem(atPath: bundleDBPath!, toPath: dbPath)
}
return ""
}
网友评论