zoukankan      html  css  js  c++  java
  • Swift本地文件管理

    转载自:http://www.coloroud.com/2015/06/01/Swift-File-Manager/

    开头

    看来Swift这趟浑水是非干不可,既然如此,那索性就来的彻底吧,来一次全方位,深入的学习之旅。

    进入正题,在Swift开发中,几乎是每一个App都需要在本地存储一些本地的持久化数据,毕竟不可能每次App使用都从网上现传数据回来使用吧,那样App的体验将会大打折扣。

    ios存储特性

    在ios体系中,每个app都是独立的,遵循沙盒机制,app之间数据相互隔离,换个更通俗易懂的说法,你可以把每个App看成是一个用户,就像在Linux系统中,每个用户有一个独立的home目录,该用户只对他的用户目录具有各项操作权。一般来所,程序之间是不可以相互访问的。

    目录结构

    Apple自ios8以后,app目录结构发生了一些变化,ios8以前按App的Bundle(程序包)和app其他目录放在一起,ios8以后,Bundle被独立起来,和其他的Bundle放在一起,app目录文件相关的数据文件放在一起。

    file://~/Library/Developer/CoreSimulator/Devices/模拟器编号/data/Containers/Bundle/Application/app目录对应的目录编号
    file://~/Library/Developer/CoreSimulator/Devices/模拟器编号/data/Containers/Data/Application/app目录对应的目录编号
    // 注:上面‘~/‘指的是你的用户主目录,比如我的是:/Users/anoxia,而Library/Developer/CoreSimulator/ 是模拟器地址。
    

    当我创建完App,会在沙盒中创建三个文件夹:Document,Library,tmp。

    Document:用来存放一些应用持久化数据,可以进行一下文件或文件夹的创建,移动和删除等操作。iTunes备份和恢复时,会包含此目录。

    Library:应用一些设置信息及其他状态信息存放于此。

    tmp:临时文件存放的目录,当ios重启时,会清空里面的数据。

    获取各目录路径

    Bundle目录相关操作:

    获取应用Bundel包路径:
    var bundlePath = NSBundle.mainBundle().bundlePath       // 包路径
    println(bunlePath)
    
    获取Bundel资源路径:
    var resourcePath = NSBundle.mainBundle().resourcePath     // 资源路径
    println(resourcePath)
    
    获取应用可执行文件路径
    var executablePath = NSBundle.mainBundle().executablePath // App可执行文件路径
    println(executablePath)
    
    在Bundel路径中搜索文件
    var infoPlistPath = NSBundle.mainBundle().URLForResource("Info", withExtension: "plist")
    println(infoPlistPath)
    

    获取应用根目录:

    var homePath = NSHomeDirectory()
    println(homePath)
    

    获取Document目录:

    var documentPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    println(documentPath.last)
    

    获取Library目录

    var libraryPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    println(libraryPath.last)
    

    获取Library下Caches

    var cachePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    println(cachePath.last)
    

    获取tmp

    var tmpPath = NSTemporaryDirectory()
    println(tmpPath)
    

    NSData

    NSString与NSData互转

    NSString转NSData
    var conversionString = "is a string"
    conversionString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
    println(converedData)
    // 输出:NSData(Optional):Optional(<69732061 20737472 696e67>)
    
    NSData转NSString
    var converbackString = NSString(data: converedData!, encoding: NSUTF8StringEncoding)
    println(converbackString)
    // 输出:NSString(Optional):Optional(is a string)
    
    UIImage转NSData
    let image = documentDir + "/bg.jpg"
    let imageData: NSData = UIImageJPEGRepresentation(UIImage(named: image), 0.1)
    

    从沙盒加载NSData类型的UIImage

    // 加载NSData
    let imagetest = fileManager.contentsAtPath(imagePath)
    println(imagetest)
    // 显示
    let imageView = UIImageView(frame: view.bounds)
    imageView.image = UIImage(named: imagePath)
    view.addSubview(imageView)
    

    NSFileManager文件管理

    var fileManager = NSFileManager.defaultManager()
    

    创建

    文件夹
    var documents = NSHomeDirectory() + "/Documents"
    var dirPath = documents + "/a/b/c"
    
    fileManager.createDirectoryAtPath(dirPath, withIntermediateDirectories: true, attributes: nil, error: nil)
    // 注:withIntermediateDirectories表示当创建的目录完整路径不满足时,是否递归创建完整路径
    
    文件
    // 存储一个普通的文本文件
    let stringContent = "Contnets of test"
    // 将文本内容转换成NSData内容
    let stringNSData = stringContent.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
    // 保存文本
    fileManager.createFileAtPath(textPath, contents: stringNSData, attributes: nil)
    

    读取

    递归遍历指定目录下所有内容
    var recursivelyResult = fileManager.subpathsOfDirectoryAtPath(documents, error: nil)
    println(recursivelyResult)
    
    遍历指定目录下内容
    var contentResult = fileManager.contentsOfDirectoryAtPath(documents, error: nil)
    println(contentResult)
    
    判断一个文件或者文件夹是否存在
    var aDir = documents + "/a"
    var exsit = fileManager.fileExistsAtPath(aDir)
    println(exsit)
    
    获取一个文件或目录的属性
    var attributes = fileManager.attributesOfItemAtPath(aDir, error: nil)
    println(attributes)
    
    设置文件或目录属性
    Bool:   fileManager.setAttributes(<#attributes: [NSObject : AnyObject]#>, ofItemAtPath: <#String#>, error: <#NSErrorPointer#>)
    
    读取文件内容
    let content = fileManager.contentsAtPath(textPath)
    println(content)
    

    移动(重命名)文件夹/文件

    let newPath = documentDir + "/new.jpg"
    fileManager.moveItemAtPath(imagePath, toPath: newPath, error: nil)
    

    删除文件或文件夹

    fileManager.removeItemAtPath(<#path: String#>, error: <#NSErrorPointer#>)
    

    比较两个文件内容是否相同

    let result = fileManager.contentsEqualAtPath(image, andPath: imagePath)
    

    读权限

    Bool:   fileManager.isReadableFileAtPath(<#path: String#>)
    

    写权限

    Bool:   fileManager.isWritableFileAtPath(<#path: String#>)
    

    NSString类路径处理方法(工具方法)

    NSString:pathWithComponens:components  //根据components中的元素构造有效路径
    NSArray:pathComponents  //析构路径,获得组成此路径的各个部分
    NSString:lastPathComponent  //提取路径的最后一个组成部分
    NSString:pathExtension  //从路径的最后一个组成部分中提取其扩展名
    NSString:stringByAppendingPathComponent:path  //将path添加到现有路径的末尾
    NSString:stringByAppendingPathExtension:ext  //将指定的扩展名添加到路径的最后一个组成部分
    NSString:stringByDeletingLastPathComponent  //删除路径的最后一个组成部分
    NSString:stringByDeletingPathExtension  //从文件的最后一部分删除扩展名
    NSString:stringByExpandingTileInPath   //将路径中代字符扩展成用户主目录(~)或指定用户的主目录(~user)
    NSString:stringByresolvingSymlinksInPath  //尝试解析路径中的符号链接
    NSString:stringByStandardizingPath  //通过尝试解析~、..(父目录符号)、.(当前目录符号)和符号链接来标准化路径
    

    示例:

    首先预定义一个文件路径:

    var filePath: NSString = "/Uesrs/anoxia/My love.mp3"
    
    • 获取组成路径的各个部分:
    println(filePath.pathComponents)
    // 输出NSArray:[/, Uesrs, anoxia, My love.mp3]
    
    • 活路路径的最后一个组成部分:
    println(filePath.lastPathComponent)
    // 输出:NSString:My love.mp3
    
    • 删除路径额的最后一个组成部分:
    println(filePath.stringByDeletingLastPathComponent)
    // 输出:NSString:/Uesrs/anoxia
    
    • 在路径最后添加路径:
    var appendPath = "file.txt"
    println(filePath.stringByAppendingPathComponent(anotherPath))
    // 输出:NSString:/Uesrs/anoxia/My love.mp3/text.a
    
    • 获取文件路径的扩展:
    println(filePath.pathExtension)
    // 输出: NSString:mp3
    
    • 在路径最后面追加扩展名:
    println(filePath.stringByAppendingPathExtension("a"))
    // 输出:NSString(Optional):Optional("/Uesrs/anoxia/My love.mp3.a")
    
    • 遍历应用目录
    let filemanager: NSFileManager = NSFileManager()
    let files = filemanager.enumeratorAtPath(NSHomeDirectory())
    while let file: AnyObject = files?.nextObject() {
        println(file)
    }
    

     

  • 相关阅读:
    二元查找树的后序遍历结果
    CFileDialog设置多选时的一个问题
    KanRSS.com
    由shuttle这个单词想起的一个小故事
    Sun Java moved to the Partner repository
    Sun Java moved to the Partner repository
    扩展std::string功能的几个做法
    NetBeans 时事通讯(刊号 # 99 Apr 16, 2010)
    NetBeans IDE 6.9 Beta 发布
    KanRSS.com
  • 原文地址:https://www.cnblogs.com/Jenaral/p/5531346.html
Copyright © 2011-2022 走看看