ios 沙盒、文件操作與app安裝路徑

ios沙盒機(jī)制

sandbox.png

沙盒包括3個(gè)文件夾及app程序打包的目錄

  1. Document:程序創(chuàng)建或應(yīng)用瀏覽產(chǎn)生的文件數(shù)據(jù),當(dāng)我們的iphone備份或恢復(fù)的時(shí)候會(huì)把這個(gè)文件目錄包含進(jìn)去(類(lèi)似android的data/data/包名)
  2. Library:程序默認(rèn)設(shè)置或狀態(tài)信息保存在該目錄(類(lèi)似android的首選項(xiàng)之類(lèi))
  3. 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/前往/前往文件夾

forwordTofolder.png

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

forwordToFolder2.png
獲取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 ""
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,150評(píng)論 25 708
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,628評(píng)論 30 472
  • 前言: 出于安全考慮,iOS系統(tǒng)的沙盒機(jī)制規(guī)定每個(gè)應(yīng)用都只能訪(fǎng)問(wèn)當(dāng)前沙盒目錄下面的文件(也有例外,比如系統(tǒng)通訊錄能...
    李sir35閱讀 16,562評(píng)論 4 19
  • 前言: 出于安全考慮,iOS系統(tǒng)的沙盒機(jī)制規(guī)定每個(gè)應(yīng)用都只能訪(fǎng)問(wèn)當(dāng)前沙盒目錄下面的文件(也有例外,比如系統(tǒng)通訊錄能...
    坤哥lqk閱讀 2,182評(píng)論 0 4
  • 學(xué)習(xí)佛法,是學(xué)習(xí)佛法的智慧!是為了讓自己活得更寬容更豁達(dá)更慈悲更自在更喜樂(lè),而不是抹去我的本心本性和對(duì)美對(duì)美好生活...
    蝶戀谷谷主閱讀 270評(píng)論 0 0

友情鏈接更多精彩內(nèi)容