您的位置:首页 > 移动开发 > Swift

Swift\本地文件管理

2016-05-26 15:32 323 查看

转载自: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包路径:
varbundlePath=NSBundle.mainBundle().bundlePath//包路径
println(bunlePath)

获取Bundel资源路径:
varresourcePath=NSBundle.mainBundle().resourcePath//资源路径
println(resourcePath)

获取应用可执行文件路径
varexecutablePath=NSBundle.mainBundle().executablePath//App可执行文件路径
println(executablePath)

在Bundel路径中搜索文件
varinfoPlistPath=NSBundle.mainBundle().URLForResource("Info",withExtension:"plist")
println(infoPlistPath)

获取应用根目录:

varhomePath=NSHomeDirectory()
println(homePath)

获取Document目录:

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

获取Library目录

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

获取Library下Caches

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

获取tmp

vartmpPath=NSTemporaryDirectory()
println(tmpPath)

NSData

NSString与NSData互转

NSString转NSData
varconversionString="isastring"
conversionString.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion:true)
println(converedData)
//输出:NSData(Optional):Optional(<6973206120737472696e67>)

NSData转NSString
varconverbackString=NSString(data:converedData!,encoding:NSUTF8StringEncoding)
println(converbackString)
//输出:NSString(Optional):Optional(isastring)

UIImage转NSData
letimage=documentDir+"/bg.jpg"
letimageData:NSData=UIImageJPEGRepresentation(UIImage(named:image),0.1)

从沙盒加载NSData类型的UIImage

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

NSFileManager文件管理

varfileManager=NSFileManager.defaultManager()

创建

文件夹
vardocuments=NSHomeDirectory()+"/Documents"
vardirPath=documents+"/a/b/c"

fileManager.createDirectoryAtPath(dirPath,withIntermediateDirectories:true,attributes:nil,error:nil)
//注:withIntermediateDirectories表示当创建的目录完整路径不满足时,是否递归创建完整路径

文件
//存储一个普通的文本文件
letstringContent="Contnetsoftest"
//将文本内容转换成NSData内容
letstringNSData=stringContent.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion:true)
//保存文本
fileManager.createFileAtPath(textPath,contents:stringNSData,attributes:nil)

读取

递归遍历指定目录下所有内容
varrecursivelyResult=fileManager.subpathsOfDirectoryAtPath(documents,error:nil)
println(recursivelyResult)

遍历指定目录下内容
varcontentResult=fileManager.contentsOfDirectoryAtPath(documents,error:nil)
println(contentResult)

判断一个文件或者文件夹是否存在
varaDir=documents+"/a"
varexsit=fileManager.fileExistsAtPath(aDir)
println(exsit)

获取一个文件或目录的属性
varattributes=fileManager.attributesOfItemAtPath(aDir,error:nil)
println(attributes)

设置文件或目录属性
Bool:fileManager.setAttributes(<#attributes:[NSObject:AnyObject]#>,ofItemAtPath:<#String#>,error:<#NSErrorPointer#>)

读取文件内容
letcontent=fileManager.contentsAtPath(textPath)
println(content)

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

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

删除文件或文件夹

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

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

letresult=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  //通过尝试解析~、..(父目录符号)、.(当前目录符号)和符号链接来标准化路径

示例:

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

varfilePath:NSString="/Uesrs/anoxia/Mylove.mp3"


获取组成路径的各个部分:

println(filePath.pathComponents)
//输出NSArray:[/,Uesrs,anoxia,Mylove.mp3]


活路路径的最后一个组成部分:

println(filePath.lastPathComponent)
//输出:NSString:Mylove.mp3


删除路径额的最后一个组成部分:

println(filePath.stringByDeletingLastPathComponent)
//输出:NSString:/Uesrs/anoxia


在路径最后添加路径:

varappendPath="file.txt"
println(filePath.stringByAppendingPathComponent(anotherPath))
//输出:NSString:/Uesrs/anoxia/Mylove.mp3/text.a


获取文件路径的扩展:

println(filePath.pathExtension)
//输出:NSString:mp3


在路径最后面追加扩展名:

println(filePath.stringByAppendingPathExtension("a"))
//输出:NSString(Optional):Optional("/Uesrs/anoxia/Mylove.mp3.a")


遍历应用目录

letfilemanager:NSFileManager=NSFileManager()
letfiles=filemanager.enumeratorAtPath(NSHomeDirectory())
whileletfile:AnyObject=files?.nextObject(){
println(file)
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: