FileManager 是 Foundation 框架中用来管理和操作文件、目录等文件系统相关联内容的类。
1、路径操作
let nfManager =NSFileManager.defaultManager()
let folderUrl:NSURL=NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop/testFolder"))!
let filerUrl:NSURL=NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop/testFile.txt"))!
let srcUrl:NSURL=NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop/testFile.txt"))!
let dstUrl:NSURL=NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop/testFolder/testFile.txt"))!// 创建文件夹/*
public func createDirectoryAtPath(path: String,
withIntermediateDirectories createIntermediates: Bool,
attributes: [String : AnyObject]?) throws
path:文件夹路径
createIntermediates:是否连同上一级路径一起创建,NO 并且上一级文件路径不存在时会创建失败。
attributes:文件夹属性,nil 系统默认属性
*/try! nfManager.createDirectoryAtPath(folderUrl.path!, withIntermediateDirectories:true, attributes:nil)// 创建文件/*
func createFileAtPath(path: String,
contents data: NSData?,
attributes attr: [NSObject : AnyObject]?) -> Bool
path:文件路径
data:文件内容,nil 空
attr:文件属性,nil 系统默认属性
Bool:文件创建成功时返回值为 true
*/let bl1:Bool = nfManager.createFileAtPath(filerUrl.path!, contents:nil, attributes:nil)// 拷贝文件/*
如果 dstUrl 路径文件已存在,该方法会终止拷贝,并返回 false。
如果 srcUrl 的最后一部分是符号链接,那么只有链接会被拷贝到新路径。
*/try! nfManager.copyItemAtPath(srcUrl.path!, toPath: dstUrl.path!)// 删除文件/*
删除成功或者 url 为 nil 时返回 true,如果发生错误返回 false。如果使用 delegate 终止了删除文件的操作,
则返回 true,如果使用 delegate 终止了删除目录的操作,则返回 false。
*/try! nfManager.removeItemAtPath(dstUrl.path!)// 移动文件/*
如果 dstUrl 路径文件已存在,该方法会终止移动,并返回 false。如果 srcUrl 的最后一部分是符号链接,
那么只有链接会被移动到新路径。链接所指向的内容仍然保持在现有的位置。
*/try! nfManager.moveItemAtPath(srcUrl.path!, toPath: dstUrl.path!)// 查找满足指定条件的路径// 返回其 URL。该方法不但可以获得标准系统目录,还可以用来创建临时路径。let url1:NSURL= try! nfManager.URLForDirectory(.DocumentDirectory,
inDomain: .UserDomainMask,
appropriateForURL:nil,
create:true)// 返回所有满足条件的路径列表let urlObjs:[NSURL] = nfManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
let url2:NSURL= urlObjs[0]// 查询指定路径下的所有子路径let urls1:[String]? = nfManager.subpathsAtPath(url1.path!)
let urls2:[String] = try! nfManager.subpathsOfDirectoryAtPath(url1.path!)// 浅遍历// 返回指定目录下的文件、子目录及符号链接的列表let contentsDir1:[String] = try! nfManager.contentsOfDirectoryAtPath(url1.path!)// 返回文件全路径/*
public func contentsOfDirectoryAtURL(url: NSURL,
includingPropertiesForKeys keys: [String]?,
options mask: NSDirectoryEnumerationOptions) throws -> [NSURL]
返回指定目录下的文件、子目录及符号链接的列表,返回的是文件全路径。
url:要进行搜索的目录路径,该路径不能为指向目标目录的符号链接,如果是可以使用 URLByResolvingSymlinksInPath 进行转换。
keys:用来传入进行搜索的一些特定条件,包括创建时间,修改时间等。
mask:SkipsHiddenFiles:表示不遍历隐藏文件,
SkipsSubdirectoryDescendants:表示不递归到子目录内部,
SkipsPackageDescendants:表示不递归到包内部。
*/let contentsDir2:[NSURL] = try! nfManager.contentsOfDirectoryAtURL(url1,
includingPropertiesForKeys:nil,
options: .SkipsHiddenFiles)// 深遍历// 返回指定目录下的所有文件及其子目录下的所有元素路径let enumeratorDir1:NSDirectoryEnumerator= nfManager.enumeratorAtPath(url1.path!)!// 返回文件全路径/*
func enumeratorAtURL(url: NSURL,
includingPropertiesForKeys keys: [AnyObject]?,
options mask: NSDirectoryEnumerationOptions,
errorHandler handler: ((NSURL!, NSError!) -> Bool)?) -> NSDirectoryEnumerator?
返回指定目录下的所有文件及其子目录下的所有元素路径,返回的是文件全路径。
url:要进行搜索的目录路径,该路径不能为指向目标目录的符号链接,如果是可以使用 URLByResolvingSymlinksInPath 进行转换。
keys:用来传入进行搜索的一些特定条件,包括创建时间,修改时间等。
mask:SkipsHiddenFiles:表示不遍历隐藏文件,
SkipsSubdirectoryDescendants:表示不递归到子目录内部,
SkipsPackageDescendants:表示不递归到包内部。
*/let enumeratorDir2:NSDirectoryEnumerator= nfManager.enumeratorAtURL(url1,
includingPropertiesForKeys:nil,
options: .SkipsHiddenFiles,
errorHandler:nil)!// 枚举遍历深层遍历let dEnu:NSDirectoryEnumerator? = nfManager.enumeratorAtPath(url1.path!)whilelet obj:AnyObject? = dEnu?.nextObject() {
print(obj)
}// 显示路径的本地化名称/*
如果指定的文件或目录不存在,会返回 path 本身。
*/let displayName:String = nfManager.displayNameAtPath(url1.path!)// 获取指定路径的各种属性let attributes:[String:AnyObject] = try! nfManager.attributesOfItemAtPath(url1.path!)// 获取指定路径文件的内容数据/*
如果指定路径为目录或发生错误,返回 nil。
*/let data:NSData? = nfManager.contentsAtPath(url1.path!.stringByAppendingString("/test.txt"))// 获取当前路径let currentPath:String = nfManager.currentDirectoryPath// 更改当前路径/*
/Users/JHQ0228/Desktop/Debug
*/let bl6:Bool = nfManager.changeCurrentDirectoryPath(NSHomeDirectory().stringByAppendingString("/Desktop/Debug"))// 获取临时工作路径/*
获取系统中可以用来创建临时文件的目录路径名,一定要在完成任务之后将在其中创建的文件删除。
*/let tempPath:NSString=NSTemporaryDirectory()// 获取用户主路径(沙盒路径)let homePath:NSString=NSHomeDirectory()// 获取指定用户的主路径/*
NSUserName(); 获取当前用户的登录名。NSFullUserName(); 获取当前用户完整用户名
*/let userHomePath:String? =NSHomeDirectoryForUser(NSUserName())// 获取用户 Documents 路径let documentPath:NSString=NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask,true)[0]// 获取 app 包路径let bundlePath =NSBundle.mainBundle().bundlePath// 创建一个新路径try! nfManager.createDirectoryAtPath(NSHomeDirectory().stringByAppendingString("/Desktop/Debug1"),
withIntermediateDirectories:true, attributes:nil)// 获取最后一个路径let lastPath:String? =NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop"))?.lastPathComponent// 删除最后一个路径let deleteLastPath:String? =NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop"))?
.URLByDeletingLastPathComponent?
.path// 拼接一个路径let appendingPath:String? =NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop"))?
.URLByAppendingPathComponent("testFolder")
.path// 文件路径分割let pathArray:[String]? =NSURL(string:NSHomeDirectory().stringByAppendingString("/Desktop"))?.pathComponents// 文件路径组合let pathString:NSString=NSString.pathWithComponents(pathArray!)// 将路径中的代字符 ~ 扩展成用户主目录或指定用户的主目录// 特殊的代字符 ~ 是用户主目录(如:/Users/JHQ0228)的缩写,~linda 表示用户 linda 主目录的缩写。let path1:NSString="~/Desktop/test.txt";// /Users/JHQ0228/Desktop/test.txtlet mainPath:String = path1.stringByExpandingTildeInPath// 解析路径中的符号链接/*
/.. 上一级目录
*/let path2:NSString="~/../Debug"let appPath1:String = path2.stringByResolvingSymlinksInPath// 通过解析 ~(用户主目录)、..(父目录) 、.(当前目录)和符号链接来标准化路径/*
NSHomeDirectory()/.. NSHomeDirectory() 的上一级目录
*/let path3:NSString=NSString(format:"%@/../Debug",NSHomeDirectory())
let appPath2:String = path3.stringByStandardizingPath// 获取文件拓展名let getExtension:String? =NSURL(string:"/Desktop/test.txt")?.pathExtension// 删除文件拓展名let deleteExtension:String? =NSURL(string:"/Desktop/test.txt")?.URLByDeletingPathExtension?.pathExtension// 拼接文件拓展名let appendingExtension:String? =NSURL(string:"/Desktop/test.txt")?.URLByAppendingPathExtension("doc").path
2、路径判断
let nfManager =NSFileManager.defaultManager()
let url1:NSURL= try! nfManager.URLForDirectory(.DocumentDirectory,
inDomain: .UserDomainMask,
appropriateForURL:nil,
create:true)// 判断路径是否存在/*
如果当前路径以~开头,需使用 NSString 的 stringByExpandingTildeInPath 方法进行处理,否则会返回 false
*/let bl1:Bool = nfManager.fileExistsAtPath(url1.path!)// 判断指定路径是否有可读权限let bl2:Bool = nfManager.isReadableFileAtPath(url1.path!)// 判断指定路径是否有可写权限let bl3:Bool = nfManager.isWritableFileAtPath(url1.path!)// 判断指定路径是否有可执行权限let bl4:Bool = nfManager.isExecutableFileAtPath(url1.path!)// 判断指定路径是否有可删除权限let bl5:Bool = nfManager.isDeletableFileAtPath(url1.path!)// 判断两个指定路径的内容是否相同let bl6:Bool = nfManager.contentsEqualAtPath(url1.path!,
andPath: url1.path!.stringByAppendingString("/test.txt"))
3、文件操作
let fileUrl:NSURL=NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,
inDomains: .UserDomainMask)[0]
as!NSURL// 文件打开// 读写var nfHandle =NSFileHandle(forUpdatingAtPath: fileUrl.path!.stringByAppendingString("/test.txt"))!// 只读var nfHandle1 =NSFileHandle(forReadingAtPath: fileUrl.path!.stringByAppendingString("/test.txt"))!// 只写var nfHandle2 =NSFileHandle(forWritingAtPath: fileUrl.path!.stringByAppendingString("/test.txt"))!// 文件句柄偏移量// 获取文件句柄指针的偏移量let offSetNum1:UInt64= nfHandle.offsetInFile// 将偏移量移到文件末尾,返回移动后的指针偏移量let offSetNum2:UInt64= nfHandle.seekToEndOfFile()// 将偏移量指向特定的位置nfHandle.seekToFileOffset(0)// 文件读取// 获取当前文件句柄的可用数据,获取后指针移到文件末尾let availableData:NSData= nfHandle.availableData// 获取从当前指针位置到文件结束的所有数据,获取后指针移到文件末尾let data1:NSData= nfHandle.readDataToEndOfFile()// 获取从当前指针位置开始读取的 length 长度的数据内容,获取后指针移到文件读取到的位置let data2:NSData= nfHandle.readDataOfLength(10)// 文件写入// 从当前指针位置写入数据到文件nfHandle.writeData("你好".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:true)!)// 文件关闭// 关闭文件nfHandle.closeFile()// 文件比较let nfManager =NSFileManager.defaultManager()// 文件路径let filePath1:String =NSHomeDirectory().stringByAppendingString("/Desktop/file1.txt")
let filePath2:String =NSHomeDirectory().stringByAppendingString("/Desktop/file2.txt")
nfManager.createFileAtPath(filePath1,
contents:"北京欢迎您".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:true),
attributes:nil)
nfManager.createFileAtPath(filePath2,
contents:"北京欢迎".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion:true),
attributes:nil)// 比较两个文件的内容是否相等let bl:Bool = nfManager.contentsEqualAtPath(filePath1, andPath: filePath2)