NSFileManager与沙盒操作
前言:iOS的沙盒机制,应用只能访问自己应用目录下的文件。iOS不像android,没有SD卡概念,不能直接访问图像、视频等内容。iOS应用产生的内容,如图像、文件、缓存内容等都必须存储在自己的沙盒内。
常识:默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。Library包含Caches、Preferences目录。
- Documents:苹果建议将程序创建产生的文件以及应用浏览产生的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录
- Library:存储程序的默认设置或其它状态信息;
- Library/Caches:存放缓存文件,保存应用的持久化数据,用于应用升级或者应用关闭后的数据保存,不会被itunes同步,所以为了减少同步的时间,可以考虑将一些比较大的文件而又不需要备份的文件放到这个目录下。
- Library/Preference:保存应用的所有偏好设置,IOS的Settings应用会在该目录中查找应用的设置信息。
- tmp:提供一个即时创建临时文件的地方,但不需要持久化,在应用关闭后,该目录下的数据将删除,也可能系统在程序不运行的时候清除。
接下来直接用代码诠释各种方法
- 各种目录或者文件操作方法都封装在viewDidLoad方法里面。
import UIKit
class ViewController: UIViewController {
let fileManager = NSFileManager.defaultManager()
let fileManager2 = NSFileManager()
override func viewDidLoad() {
super.viewDidLoad()
getDocumentPath()
getLibraryPath()
getCachePath()
getTempPath()
creatDirectory()
creatFile()
fileIsExist()
item操作()
readFile()
}
func getDocumentPath(){
// 第一种获取路径方式
let HomePath = NSHomeDirectory()
print(HomePath)
let docPATH = HomePath + "/Documents" //cache 和library也可这样拼接
print(docPATH)
// 第二种获取路径方式
let pathArr = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentPath = pathArr[0] as String
print(documentPath)
// 第三种获取路径方式
let urls = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask) as [NSURL]
if urls.count > 0{
print("--------\(urls[0])")
print("--------\(urls)")
}
// 第四种获取路径方式
do{
let url = try fileManager.URLForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomain: NSSearchPathDomainMask.UserDomainMask, appropriateForURL: nil, create: false)
print("--------\(url)")
}catch{
}
}
//上面两个方法URLsForDirectory和URLForDirectory区别在于URLForDirectory还可以创建临时目录
func getLibraryPath(){
let libtraryPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String
print(libtraryPath)
}
func getCachePath(){
let cachePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String
print(cachePath)
}
func getTempPath(){
let tempPath = NSTemporaryDirectory()
print(tempPath)
let homePath = NSHomeDirectory()
let tempPath1 = homePath + "/tmp/"
print(tempPath1)
}
func creatDirectory()->String{
let documentPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as String
//如果转成string,则可以直接用 + “/grandre”
let documentPathGrandre = (documentPath as NSString).stringByAppendingPathComponent("/grandre")
let documentPath2 = documentPath + "/grandre1/grandre2"
//withIntermediateDirectories 设置为true, 代表中间所有的路径目录如果不存在,都会创建
do{
try NSFileManager.defaultManager().createDirectoryAtPath(documentPathGrandre, withIntermediateDirectories: true, attributes: nil)
try NSFileManager.defaultManager().createDirectoryAtPath(documentPath2, withIntermediateDirectories: true, attributes: nil)
}catch{
print("创建目录出错")
}
return documentPath2
}
func creatFile(){
// 创建file第一种方式。通过写入content来创建新文件。
let filePath = creatDirectory() + "/gr.text"
let content = "hello grandre"
do{
try content.writeToFile(filePath, atomically: true, encoding: NSUTF8StringEncoding)
}catch{
print("创建文件失败")
}
// 创建file第二种方式。
let filePath2 = creatDirectory() + "/gr2.text"
let result = NSFileManager.defaultManager().createFileAtPath(filePath2, contents: nil, attributes: nil)
if result{
print("success creat file ")
}else{
print("error creat file")
}
}
func fileIsExist(){
//用来判断文件或者目录是否存在
if fileManager.fileExistsAtPath(creatDirectory() + "/gr2.text"){
print("存在/gr2.text")
}
if fileManager.fileExistsAtPath(creatDirectory()){
print("存在目录\(creatDirectory())")
}
}
func item操作(){
//移动目录,dest路径中必须包含目录名,当然顺便可以更改目录名。
let documentsUrl = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let destUrl = documentsUrl as String + "/grandre2"
do{
try fileManager.moveItemAtPath(creatDirectory(), toPath: destUrl)
}catch{
print("move directory error")
}
//移动文件,dest路径中必须包含文件名,当然顺便可以更改文件名。
do{
try fileManager.moveItemAtPath(destUrl+"/gr.text", toPath: documentsUrl as String + "/grandre1/gr1.text")
}catch{
print("move file error")
}
//复制目录,也可更名
do{
try fileManager.copyItemAtPath(documentsUrl as String + "/grandre1", toPath: documentsUrl as String + "/grandre3")
}catch{
print("copy directory error")
}
do{
try fileManager.copyItemAtPath(documentsUrl as String + "/grandre1", toPath: documentsUrl as String + "/grandre3/grandre1")
}catch{
print("copy directory error")
}
//复制文件,也可更名
do{
try fileManager.copyItemAtPath(documentsUrl as String + "/grandre1/gr1.text", toPath: documentsUrl as String + "/grandre/gr1.text")
}catch{
print("copy file error")
}
//删除指定item(目录或者文件)
try?fileManager.removeItemAtPath(documentsUrl+"/grandre3/grandre1")
//获取指定路径下的所有目录和文件,递归,深度。也即是下一级的子目录子文件也会被列出来。
let itemGetArr1 = fileManager.subpathsAtPath(documentsUrl)
print(itemGetArr1)
let itemGetArr2 = try? fileManager.subpathsOfDirectoryAtPath(documentsUrl)
print(itemGetArr2)
//只获取指定目录下的目录。而且非递归。浅度。
let itemGetArr3 = try? fileManager.contentsOfDirectoryAtPath(documentsUrl)
print(itemGetArr3)
//获取指定目录下的所有文件和目录,递归,深度。返回的是NSDirectoryEnumerator。
let itemGetArr4 = fileManager.enumeratorAtPath(documentsUrl)
for i in itemGetArr4!{
print(i)
}
//获取指定item(目录或者文件)的属性。
let itemAttributes = try?fileManager.attributesOfItemAtPath(documentsUrl)
print(itemAttributes)
let itemAttributes1 = try?fileManager.attributesOfItemAtPath(documentsUrl+"/grandre/gr1.text")
print(itemAttributes1)
//比较两个文件是否相同
if fileManager.contentsEqualAtPath(documentsUrl+"/grandre1/gr1.text", andPath: documentsUrl+"/grandre3/gr1.text"){
NSLog("two files are the same")
}
}
func readFile(){
//只能读取文件的内容,不能读取目录的内容
//第一种读取方式
let documentsUrl = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
do{
let content = try?NSString(contentsOfFile: documentsUrl + "/grandre1/gr1.text", encoding: NSUTF8StringEncoding)
print(content)
}catch{
print("read file error")
}
//第二种读取方式
let content1 = fileManager.contentsAtPath(documentsUrl + "/grandre1/gr1.text")
let result1 = NSString(data: content1!, encoding: NSUTF8StringEncoding)
print(result1)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
-(NSString *)currentDirectoryPath 获取当前目录
-(BOOL)changeCurrentDirectoryPath:path 更改当前目录
//常用路径工具方法
-(NSString *) pathWithComponents:components 根据components中元素构造有效路径
-(NSArray *)pathComponents 析构路径,获取路径的各个部分
-(NSString *)lastPathComponent 提取路径的最后一个组成部分
-(NSString *)pathExtension 路径扩展名
-(NSString *)stringByAppendingPathComponent:path 将path添加到现有路径末尾
-(NSString *)stringByAppendingPathExtension:ext 将拓展名添加的路径最后一个组成部分
-(NSString *)stringByDeletingPathComponent 删除路径的最后一个部分
-(NSString *)stringByDeletingPathExtension 删除路径的最后一个部分 的扩展名
-(NSString *)stringByExpandingTildeInPath 将路径中的代字符扩展成用户主目录(~)或指定用户主目录(~user)
-(NSString *)stringByResolvingSymlinksInPath 尝试解析路径中的符号链接
-(NSString *)stringByStandardizingPath 通过尝试解析~、..、.、和符号链接来标准化路径
网友评论