ios 沙盒、文件操作与app安装路径

ios沙盒机制

sandbox.png

沙盒包括3个文件夹及app程序打包的目录

  1. Document:程序创建或应用浏览产生的文件数据,当我们的iphone备份或恢复的时候会把这个文件目录包含进去(类似android的data/data/包名)
  2. Library:程序默认设置或状态信息保存在该目录(类似android的首选项之类)
  3. 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/前往/前往文件夹

forwordTofolder.png

也就是说在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 ""
    }

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 131,710评论 20 559
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 21,561评论 40 455
  • 前言: 出于安全考虑,iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件(也有例外,比如系统通讯录能...
    李sir35阅读 11,826评论 4 17
  • 前言: 出于安全考虑,iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件(也有例外,比如系统通讯录能...
    坤哥lqk阅读 537评论 0 4
  • 四月的人间最是阳光谄媚,从湖面吹来的风儿悄无声息的滋润着人们每一条在日常紧张的神经,雨后的晴天就数草地泼辣没有任何...
    邱读书阅读 51评论 0 1