//***************************************************
//
// >>>>>>>Swift调用OC之文件操作-NSFileManager<<<<<<<
//
// **** 本节内容 ****
//
// 1.目录查询
// 2.路径查询
// 3.路径操作
// --创建目录
// --创建文件
// --拷贝/删除/移动文件/目录
// --获取文件访问权限
//
//***************************************************
import Foundation
//====================================
//
//******* NSFileManager *********
//
//====================================
//使用实例defaultManager()来处理文件操作
let manager = NSFileManager.defaultManager()
//>>>>>>>>目录查询<<<<<<<<<
//获取目录有两个方法:URLsForDirectory和URLForDirectory
//方法区别在于URLForDirectory还可以创建临时目录
//获得当前用户域下的Library/Application Support目录
let urlsForDirectory = manager.URLsForDirectory(NSSearchPathDirectory.ApplicationSupportDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask) //file:///Users/.../Library/Containers/.../Data/Library/Application%20Support/
//获得当前用户域下Documents目录
let urlForDirectory = manager.URLForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomain: NSSearchPathDomainMask.UserDomainMask,appropriateForURL: nil, create: true, error: nil)// file:///Users/.../Library/Containers/.../Data/Documents/
//>>>>>>>>路径查询<<<<<<<<<<<<<<<<<<
// 1.浅搜索,只搜索当前目录层
// --方法1:contentsOfDirectoryAtPath
// --方法2:contentsOfDirectoryAtURL
// --区别在于方法1只返回文件和目录,方法2会把完整路径都返回
// 2.深度遍历,遍历到子目录下的内容(符号链接不处理)
// --方法1:enumeratorAtPath
// --方法2:enumeratorAtURL
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
let urlForDocument = manager.URLsForDirectory( NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask) //
let url = urlForDocument[0] asNSURL
var error: NSErrorPointer = nil
//浅搜索1:contentsOfDirectoryAtPath
let contentsOfPath_Shallow = manager.contentsOfDirectoryAtPath(url.path!,error: error)
//浅搜索2:contentsOfDirectoryAtURL
//includingPropertiesForKeys参数是指特定条件,如创建时间
let contentsOfURL_Shallow = manager.contentsOfDirectoryAtURL(url, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsHiddenFiles,error: error)
//深度遍历1:enumeratorAtPath
let contentsOfPath_Deep = manager.enumeratorAtPath(url.path!)
println(contentsOfPath_Deep?.allObjects) //[folder, folder/new.txt, text123.txt]
//深度遍历2:enumeratorAtURL
let contentsOfURL_Deep = manager.enumeratorAtURL(url,includingPropertiesForKeys:nil , options: NSDirectoryEnumerationOptions.SkipsHiddenFiles,errorHandler: nil)
//>>>>>>>> 路径操作 <<<<<<<<<<<
//
// 1.创建目录:createDirectoryAtURL
// 2.创建文件:createFileAtPath
// --将缓存NSData的数据写入成文件
// 3.拷贝:copyItemAtPath
//
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
//1.创建目录:createDirectoryAtURL
//withIntermediateDirectories:true表示如果当前路径所指定的目录中父目录不存在,那么就连同父目录一起创建
func createFolder(#FolderName: String, #BaseUrl: NSURL){
let manager = NSFileManager.defaultManager()
var error: NSErrorPointer= nil
let folder = BaseUrl.URLByAppendingPathComponent(FolderName,isDirectory: true)
println("folder =\(folder)")
let exist = manager.fileExistsAtPath(folder.path!)
if !exist {
let createSuccess = manager.createDirectoryAtURL(folder,withIntermediateDirectories: true,attributes: nil, error: error)
println("createfolder success = \(createSuccess)")
}
}
//2.创建文件:createFileAtPath
func createFile(#FileName : String, #FileBaseUrl : NSURL){
let manager = NSFileManager.defaultManager()
var error : NSErrorPointer= nil
let file = FileBaseUrl.URLByAppendingPathComponent(FileName)
println("file = \(file)")
let exist = manager.fileExistsAtPath(file.path!)
if !exist {
let data = NSData(base64EncodedString:"aGVsbG8gd29ybGQ=", options:.IgnoreUnknownCharacters)
let createSuccess = manager.createFileAtPath(file.path!,contents: data, attributes: nil)
println("createfile success = \(createSuccess)")
}
}
//--------- 3.拷贝文件/目录 -----------
//***方法:copyItemAtPath
//---将指定路径下的一个文件(test.txt)拷贝到对应目录下另外一个文件(copyed.txt)
//---将指定路径下的一个目录拷贝到对应目录
//---当前进程要有读取srcURL的权限并且有toUrl的父级目录的写权限
let urlForDocument1 = manager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
let url1 = urlForDocument1[0] asNSURL//URLsForDirectory返回的是[AnyObject],所以要转换
var error1: NSErrorPointer = nil
createFile(FileName: "test1.txt",FileBaseUrl: url1)
createFile(FileName: "folder",FileBaseUrl: url1)
createFile(FileName: "folder/new1.txt",FileBaseUrl: url1)
let srcUrl = url1.URLByAppendingPathComponent("test1.txt") //换成folder则拷贝目录
let toUrl = url1.URLByAppendingPathComponent("copyed.txt")
let copyItemSuccess = manager.copyItemAtPath(srcUrl.path!, toPath: toUrl.path!, error: error) //返回BOOL
//--------- 4.删除文件/目录 -----------
//***方法:removeItemAtURL
//---当前进程要有toUrl的父级目录的写权限
let removeItemSuccess = manager.removeItemAtURL(toUrl,error: error)
//--------- 5.移动文件/目录 -----------
//***方法:moveItemAtURL
//---当前进程要有srcUrl和toUrl的父级目录的写权限
let moveItemSuccess = manager.moveItemAtURL(srcUrl,toURL: toUrl, error: error)
//--------- 6.文件访问权限 -----------
let displayName = manager.displayNameAtPath(url.path!) //返回本地化名:Documents
let file6 = url.URLByAppendingPathComponent("copyed.txt") //返回完整路径的Documents/test.txt
//获取权限属性
let readable = manager.isReadableFileAtPath(file6.path!) //true
let writeable = manager.isWritableFileAtPath(file6.path!) //true
let executable = manager.isExecutableFileAtPath(file6.path!) //false
let deleteable = manager.isDeletableFileAtPath(file6.path!) //true
//获取各种属性,比如创建时间,文件大小,文件类型等
let attributes = manager.attributesOfItemAtPath(file6.path!, error: error)
println(attributes!)
/*
[NSFileOwnerAccountID:501, NSFileSystemFileNumber: 3955613, NSFileExtensionHidden: 0,NSFileSystemNumber: 16777218, NSFileSize: 11, NSFileGroupOwnerAccountID: 20,NSFilePosixPermissions: 420, NSFileCreationDate: 2015-02-02 14:03:19 +0000,NSFileType: NSFileTypeRegular, NSFileGroupOwnerAccountName: staff,NSFileReferenceCount: 1, NSFileModificationDate: 2015-02-02 14:03:19 +0000]
*/
//获取内容数据:contentsAtPath
//目录不正确或者获取错误则返回nil
let data6 = manager.contentsAtPath(file6.path!)
//比较文件/目录内文件是否相同
let contentIsEqual = manager.contentsEqualAtPath(file6.path!, andPath: toUrl.path!) //true 都是test.txt