iOS - Swift NSFileManage 文件管理

简介: 前言 public class NSFileManager : NSObject public class NSFileHandle : NSObject, NSSecureCoding NSFileManager 是 Foundation 框架中用来管理和操作文件、目录等文件系统相关联内容的类。

前言

    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)                                      
目录
相关文章
|
6月前
|
Swift iOS开发
iOS Swift使用Alamofire请求本地服务器报错-1002
iOS Swift使用Alamofire请求本地服务器报错-1002
152 1
|
7月前
|
Unix 调度 Swift
苹果iOS新手开发之Swift 中获取时间戳有哪些方式?
在Swift中获取时间戳有四种常见方式:1) 使用`Date`对象获取秒级或毫秒级时间戳;2) 通过`CFAbsoluteTimeGetCurrent`获取Core Foundation的秒数,需转换为Unix时间戳;3) 使用`DispatchTime.now()`获取纳秒级精度的调度时间点;4) `ProcessInfo`提供设备启动后的秒数,不表示绝对时间。不同方法适用于不同的精度和场景需求。
240 3
|
3月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
76 2
|
3月前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
94 9
|
3月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
98 1
|
3月前
|
安全 API Swift
探索iOS开发中的Swift语言之美
【10月更文挑战第23天】在数字时代的浪潮中,iOS开发如同一艘航船,而Swift语言则是推动这艘船前进的风帆。本文将带你领略Swift的独特魅力,从语法到设计哲学,再到实际应用案例,我们将一步步深入这个现代编程语言的世界。你将发现,Swift不仅仅是一种编程语言,它是苹果生态系统中的一个创新工具,它让iOS开发变得更加高效、安全和有趣。让我们一起启航,探索Swift的奥秘,感受编程的乐趣。
|
4月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
【10月更文挑战第18天】本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户按下按钮时,按钮将从圆形变为椭圆形并从蓝色渐变为绿色;释放按钮时,动画恢复原状。通过UIView的动画方法和弹簧动画效果,实现平滑自然的动画过渡。
83 5
|
4月前
|
安全 Swift iOS开发
探索iOS开发中的Swift语言之美
在数字时代的浪潮中,移动应用已成为日常生活的延伸。本文将深入探讨iOS平台上的Swift编程语言,揭示其背后的设计哲学、语法特性以及如何利用Swift进行高效开发。我们将通过实际代码示例,展示Swift语言的强大功能和优雅简洁的编程风格,引导读者理解并运用Swift解决实际问题。
|
5月前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
70 4
|
5月前
|
安全 编译器 Swift
探索iOS开发之旅:Swift编程语言的魅力与挑战
【9月更文挑战第5天】在iOS应用开发的广阔天地中,Swift作为苹果官方推荐的编程语言,以其简洁、高效和安全的特点,成为了开发者的新宠。本文将带领你领略Swift语言的独特魅力,同时探讨在实际开发过程中可能遇到的挑战,以及如何克服这些挑战,成为一名优秀的iOS开发者。

热门文章

最新文章

  • 1
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 2
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 3
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 6
    iOS各个证书生成细节
  • 7
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
  • 8
    9.Swift学习之数组
  • 9
    快看Sample代码,速学Swift语言(2)-基础介绍
  • 10
    swift(MJRefresh框架)的使用
  • 1
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    9
  • 2
    iOS各个证书生成细节
    22
  • 3
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    118
  • 4
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    40
  • 5
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    55
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    46
  • 7
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    40
  • 8
    uniapp开发ios打包Error code = -5000 Error message: Error: certificate file(p12) import failed!报错问题如何解决
    152
  • 9
    【05】2025年1月首发完整版-篇幅较长-苹果app如何上架到app store完整流程·不借助第三方上架工具的情况下无需花钱但需仔细学习-优雅草央千澈详解关于APP签名以及分发-们最关心的一篇来了-IOS上架app
    310
  • 10
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
    106
  • 相关课程

    更多