• iOS


    前言

    	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)    									
    
  • 相关阅读:
    【Web技术】(一)IIS Web服务器的安装与配置
    《数据结构课程设计》图结构练习:List Component
    ExcelUtils 导表实例
    SSH整合常见错误
    mysql索引优化
    数据库三范式
    sql联接那点儿事儿
    面试java简答题
    集合类框架
    数据库连接类oracleHelper
  • 原文地址:https://www.cnblogs.com/QianChia/p/5777494.html
Copyright © 2020-2023  润新知