ios沙盒機(jī)制

沙盒包括3個(gè)文件夾及app程序打包的目錄
- Document:程序創(chuàng)建或應(yīng)用瀏覽產(chǎn)生的文件數(shù)據(jù),當(dāng)我們的iphone備份或恢復(fù)的時(shí)候會(huì)把這個(gè)文件目錄包含進(jìn)去(類(lèi)似android的data/data/包名)
- Library:程序默認(rèn)設(shè)置或狀態(tài)信息保存在該目錄(類(lèi)似android的首選項(xiàng)之類(lèi))
- tem:提供一個(gè)即時(shí)創(chuàng)建臨時(shí)文件的地方,但不需要持久化,應(yīng)用關(guān)閉之后就可能被刪除或系統(tǒng)在程序不運(yùn)行時(shí),會(huì)幫助我們清楚掉(類(lèi)似android中緩沖ACache類(lèi)似sd卡、或應(yīng)用專(zhuān)享目錄storage/emulated/0/Android/data/app_package_name/files與cache目錄)
獲取沙盒路徑
//獲取home 目錄
func home()->String{
let homeDirectory = NSHomeDirectory()
//NSLog("沙盒目錄home=%d", homeDirectory) //這樣僅僅是打印內(nèi)存地址
NSLog("沙盒目錄home=%@", homeDirectory)//用@才能打印字符
return homeDirectory
}
比如我的到的結(jié)果是
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中打開(kāi)finder/前往/前往文件夾

也就是說(shuō)在mac中查看iphone中存儲(chǔ)的文件其實(shí)就是用finder工具就可以。android需要借助ddms或adb命令(初次接觸ios,如果描述的不對(duì),請(qǐng)各位指正一二)

獲取Documents目錄
func getDocumentsPath()->String{
//方法1
//第一個(gè)參數(shù):指定了搜索的路徑名稱(chēng)
//第2個(gè)參數(shù):限定了在沙盒內(nèi)部
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 文件操作
一般用于本地化數(shù)據(jù)(僅涉及基本的文件讀寫(xiě)進(jìn)行開(kāi)發(fā))
- 圖片處理
- 個(gè)性化信息處理
- 共用信息分享
- 網(wǎng)絡(luò)數(shù)據(jù)緩沖
輕量型關(guān)系數(shù)據(jù)庫(kù),不在此范疇。
涉及的主要類(lèi)
-FileHandle類(lèi)主要對(duì)文件內(nèi)容進(jìn)行讀取和寫(xiě)入操作
FileManager類(lèi)主要對(duì)文件的操作(刪除、創(chuàng)建)
URL 文件路徑拼接等操作
String 、NSArray、Data可以直接用write方法寫(xiě)入文件
獲取FileManager實(shí)例
func getFileManager()->FileManager{
return FileManager.default
}
在app沙盒的document中創(chuàng)建一個(gè)文件夾
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("文件夾創(chuàng)建成失敗")
return false
}
print("文件夾創(chuàng)建成成功")
return true
}
創(chuàng)建文件,并寫(xiě)入內(nèi)容
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("文件創(chuàng)建結(jié)果: \(createSuccess)")
}
return true
}
在document目錄創(chuàng)建文件
let manager = FileManager.default
let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)
let url = urlForDocument[0] as URL
createFile(name: "幫助說(shuō)明.txt",fileBaseUrl: url)
app程序打包的目錄(類(lèi)似android系統(tǒng)中的/data/app/*.apk)
簡(jiǎn)單說(shuō)明:工程打包安裝后會(huì)在NSBundle.mainBundle()路徑下,該路徑是只讀的,不允許修改。
所以當(dāng)我們工程中有一個(gè)SQLite數(shù)據(jù)庫(kù)要使用,在程序啟動(dòng)時(shí),我們可以把該路徑下的數(shù)據(jù)庫(kù)拷貝一份到Documents路徑下,以后整個(gè)工程都將操作Documents路徑下的數(shù)據(jù)庫(kù)。
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{
//聲明一個(gè)Documents下的路徑
let dbPath = NSHomeDirectory() + "/Documents/hanggeDB.sqlite"
//判斷數(shù)據(jù)庫(kù)文件是否存在
if !FileManager.default.fileExists(atPath: dbPath){
//獲取安裝包內(nèi)數(shù)據(jù)庫(kù)路徑
let bundleDBPath:String? = Bundle.main.path(forResource: "younghareDB", ofType: "sqlite")
//將安裝包內(nèi)數(shù)據(jù)庫(kù)拷貝到Documents目錄下
try! FileManager.default.copyItem(atPath: bundleDBPath!, toPath: dbPath)
}
return ""
}