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 ""
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,116评论 25 707
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,140评论 30 470
  • 前言: 出于安全考虑,iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件(也有例外,比如系统通讯录能...
    李sir35阅读 16,023评论 4 19
  • 前言: 出于安全考虑,iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件(也有例外,比如系统通讯录能...
    坤哥lqk阅读 2,116评论 0 4
  • 学习佛法,是学习佛法的智慧!是为了让自己活得更宽容更豁达更慈悲更自在更喜乐,而不是抹去我的本心本性和对美对美好生活...
    蝶恋谷谷主阅读 207评论 0 0