iOS - Swift NSFileManage 文件管理
前言 public class NSFileManager : NSObject public class NSFileHandle : NSObject, NSSecureCoding NSFileManager 是 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!) while let 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.txt let 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)