• Swift


    已更新到swift3
    ios开发经常会遇到读文件,写文件等,对文件和文件夹的操作,这时就可以使用FileManager,FileHandle等类来实现。
    下面总结了各种常用的操作:
    1,遍历一个目录下的所有文件
    //1、首先我们获取用户文档目录路径
            let manager = FileManager.default
            let urlForDocument = manager.urls(for: .documentDirectory, in: .userDomainMask)
            let url = urlForDocument[0] as URL
            print(url)
            
            //2、对指定的路径执行浅搜索,返回制定目录路径下的文件、子目录及符号链接的列表
            let contentsOfPath = try? manager.contentsOfDirectory(atPath: url.path)
            print("contentsOfPath:(String(describing: contentsOfPath))")
            
            //3、类似上面的,对指定路径执行浅搜索,返回制定目录路径下的文件、子目录及符号链接的列表
            let hcontentsOfPath = try? manager.contentsOfDirectory(at: url, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)
            print("hcontentsOfPath:(String(describing: hcontentsOfPath))")
            
            //4、深度遍历,会递归遍历子文件夹(但不会递归符号链接)
            let enumeratorAtPath = manager.enumerator(atPath: url.path)
            print("enumeratorAtPath:(String(describing: enumeratorAtPath))")
            
            //5、类似上面的,深度遍历,会递归遍历子文件夹(但不会递归符号链接)
            let eunmeratorAtURL = manager.enumerator(at: url, includingPropertiesForKeys: nil, options: .skipsHiddenFiles, errorHandler: nil)
            print("enumeratorAtURL:(String(describing: eunmeratorAtURL?.allObjects))")
            
            //6、深度遍历,会递归遍历子文件夹(包括符号链接,所以要求性能的话用enumeratorAtPath)
            let subPaths = manager.subpaths(atPath: url.path)
            print("subpaths:(String(describing: subPaths))")
    2,判断文件或文件夹是否存在
    //判断文件夹是否存在
            let filePaths:String = NSHomeDirectory() + "/Documents/test1"
            print(filePaths)
            
            let exist = manager.fileExists(atPath: filePaths)
            print(exist)
            if exist {
                print("有")
            }else
            {
                print("无")
            }

    3,创建文件夹

    方式1:

    let myDirectory:String = NSHomeDirectory() + "/Documents/myFile/Files"
            let fileManager = FileManager.default
            
            //withIntermediateDirectories为ture表示路径中间如果有不存在的文件夹都会创建
            try! fileManager.createDirectory(atPath: myDirectory, withIntermediateDirectories: true, attributes: nil)

    方式2:

    func creatFiles(name:String,baseURL:NSURL) {
            let hmanager = FileManager.default
            let myFolders = baseURL.appendingPathComponent(name, isDirectory: true)
            print("文件夹:(String(describing: myFolders))")
            
            let exist = hmanager.fileExists(atPath: myFolders!.path)
            
            if !exist {
                try! hmanager.createDirectory(at: myFolders!, withIntermediateDirectories: true, attributes: nil)
            }
            
        }
    let hurlForDocument = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
    let hurl = urlForDocument[0] as NSURL creatFiles(name: "Folder", baseURL: hurl)

    4,将对象写入文件

    可以通过writeToFile方法,可以创建文件并将对象写入,对象包括String,NSString,UIImage,NSArray,NSDictionary等。
    (1)把String保存到文件
    let hfilepath:String = NSHomeDirectory() + "/Documents/hero.txt"
    let info = "欢迎来到hero11223.com"
    try! info.write(toFile: hfilepath, atomically: true, encoding: String.Encoding.utf8)

    (2)把图片保存到文件路径下

    let h1filePath:String = NSHomeDirectory() + "/Documents/hero.png"
    let himage = UIImage(named: "Icon_180.png")
    let hdata:Data = UIImagePNGRepresentation(himage!)!
    try? hdata.write(to: URL(fileURLWithPath: h1filePath))

    (3)把NSArray保存到文件路径下

    let array:NSArray = ["aaa","bbb","ccc"]
    print(array)
    let h2filePath:String = NSHomeDirectory() + "/Documents/array.plist"
    print(h2filePath)
    array.write(toFile: h2filePath, atomically: true)

    (4)把NSDictionary保存到文件路径下

    let dictionary:NSDictionary = ["gold":"1kl","silver":"2k"]
    print(dictionary)
    let h3filePath:String = NSHomeDirectory() + "/Documents/dictionary.plist"
    print(h3filePath)
    dictionary.write(toFile: h3filePath, atomically: true)

    5,创建文件

    //创建文件
        func creatFile(name:String,baseurl:URL) {
            let manager = FileManager.default
            
            let file = baseurl.appendingPathComponent(name)
            print("文件:(file)")
            
            let exist = manager.fileExists(atPath: file.path)
            
            if !exist {
                let data = Data(base64Encoded:"aGVsbG8gd29ybGQ=" ,options:.ignoreUnknownCharacters)
                let createSuccess = manager.createFile(atPath: file.path, contents: data, attributes: nil)
                
                print("文件创建结果:(createSuccess)")
            }
            
            
        }

    //在文档目录下新建test.txt文件 let h1urlForDocument = manager.urls(for: .documentDirectory, in: .userDomainMask)
    let h1url = urlForDocument[0]
    creatFile(name: "hero11.txt", baseurl: h1url)

    6,复制文件 

    (1)方法1

    let fileManager = FileManager.default
    let homeDirectory = NSHomeDirectory()
    let srcUrl = homeDirectory + "/Documents/hero.txt"
    let toUrl = homeDirectory + "/Documents/copyed.txt"
    try! fileManager.copyItem(atPath: srcUrl, toPath: toUrl)

    (2)方法2

    // 定位到用户文档目录
    let manager = FileManager.default
    let urlForDocument = manager.urls( for:.documentDirectory, in:.userDomainMask)
    let url = urlForDocument[0]
     
    // 将test.txt文件拷贝到文档目录根目录下的copyed.txt文件
    let srcUrl = url.appendingPathComponent("test.txt")
    let toUrl = url.appendingPathComponent("copyed.txt")
     
    try! manager.copyItem(at: srcUrl, to: toUrl)

    7,移动文件
    (1)方法1

    let fileManager = FileManager.default
    let homeDirectory = NSHomeDirectory()
    let srcUrl = homeDirectory + "/Documents/hangge.txt"
    let toUrl = homeDirectory + "/Documents/moved"
    try! fileManager.moveItem(srcUrl, toPath: toUrl)

    (2)方法2

    // 定位到用户文档目录
    let manager = FileManager.default
    let urlForDocument = manager.urls( for: .documentDirectory, in:.userDomainMask)
    let url = urlForDocument[0]
     
    let srcUrl = url.appendingPathComponent("test.txt")
    let toUrl = url.appendingPathComponent("copyed.txt")
    // 移动srcUrl中的文件(test.txt)到toUrl中(copyed.txt)
    try! manager.moveItemAtURL(srcUrl, toURL: toUrl)

    8,删除文件
    (1)方法1

    let fileManager = FileManager.default
    let homeDirectory = NSHomeDirectory()
    let srcUrl = homeDirectory + "/Documents/hangge.txt"
    try! fileManager.removeItem(srcUrl)

    (2)方法2

    // 定位到用户文档目录
    let manager = FileManager.default
    let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)
    let url = urlForDocument[0]
     
    let toUrl = url.appendingPathComponent("copyed.txt")
    // 删除文档根目录下的toUrl路径的文件(copyed.txt文件)
    try! manager.removeItem(toUrl)

    9,删除目录下所有的文件
    (1)方法1:获取所有文件,然后遍历删除

    let fileManager = FileManager.default
    let myDirectory = NSHomeDirectory() + "/Documents/Files"
    let fileArray = fileManager.subpaths(atPath:myDirectory)
    for fn in fileArray!{
        try! fileManager.removeItem(myDirectory + "/(fn)")
    }

    (2)方法2:删除目录后重新创建该目录

    let fileManager = FileManager.default
    let myDirectory = NSHomeDirectory() + "/Documents/Files"
    try! fileManager.removeItem(atPath: myDirectory)
    try! fileManager.createDirectory(atPath: myDirectory, withIntermediateDirectories: true,
        attributes: nil)

    10,读取文件  here

    let manager = FileManager.default
    let urlsForDocDirectory = manager.urls(for: .documentDirectory, in:.userDomainMask)
    let docPath:NSURL = urlsForDocDirectory[0]
    let file = docPath.appendingPathComponent("test.txt")
     
    //方法1
    let readHandler = try! FileHandle(forReadingFrom:file)
    let data = readHandler.readDataToEndOfFile()
    let readString = String(data: data, encoding: String.Encoding.utf8)
    print("文件内容: (readString)")
     
    //方法2
    let data = manager.contents(atPath: file.path)
    let readString = String(data: data!, encoding: String.Encoding.utf8)
    print("文件内容: (readString)")

    11,在任意位置写入数据

    let manager = FileManager.default
    let urlsForDocDirectory = manager.urls(for:.documentDirectory, in:.userDomainMask)
    let docPath:NSURL = urlsForDocDirectory[0]
    let file = docPath.appendingPathComponent("test.txt")
     
    let string = "添加一些文字到末尾"
    let appendedData = string.data(using: String.Encoding.utf8, allowLossyConversion: true)
    let writeHandler = try? FileHandle(forWritingTo:file)
    writeHandler!.seekToEndOfFile()
    writeHandler!.writeData(appendedData!)

    12,文件权限判断

    let manager = FileManager.default
    let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)
    let docPath:NSURL = urlForDocument[0]
    let file = docPath.appendingPathComponent("test.txt")
     
    let readable = manager.isReadableFile(atPath:file.path!)
    print("可读: (readable)")
    let writeable = manager.isWritableFile(atPath:file.path!)
    print("可写: (writeable)")
    let executable = manager.isExecutableFile(atPath:file.path!)
    print("可执行: (executable)")
    let deleteable = manager.isDeletableFile(atPath:file.path!)
    print("可删除: (deleteable)")

    13,获取文件属性(创建时间,修改时间,文件大小,文件类型等信息)

    let manager = FileManager.default
    let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)
    let docPath:NSURL = urlsForDocDirectory[0]
    let file = docPath.appendingPathComponent("test.txt")
     
    let attributes = try? manager.attributesOfItem(atPath: file.path!) //结果为AnyObject类型
    print("attributes: (attributes!)")

    14,文件/文件夹比较

    let manager = FileManager.default
    let urlForDocument = manager.urls(for: .documentDirectory, in:.userDomainMask)
    let docPath:NSURL = urlForDocument[0]
    let contents = try! manager.contentsOfDirectory(atPath: docPath.path!)
     
    //下面比较前面两个文件是否内容相同(该方法也可以用来比较目录)
    let count = contents.count
    if count > 1 {
        let path1 = docPath.path! + "/" + (contents[0] as String)
        let path2 = docPath.path! + "/" + (contents[1] as String)
        let equal = manager.contentsEqualAtPath(path1,andPath:path2)
        print("比较结果: (equal)")
    }

    原文出自:www.hangge.com  转载请保留原文链接:http://www.hangge.com/blog/cache/detail_527.html  感谢航哥

  • 相关阅读:
    Pull Request
    选择器
    常见HTTP状态码
    286. Walls and Gates
    200. Number of Islands
    1. Two Sum
    名片管理系统(python实现)
    k近邻算法(简单版)
    基数排序
    递归算法的调试
  • 原文地址:https://www.cnblogs.com/hero11223/p/5689074.html
Copyright © 2020-2023  润新知