zoukankan      html  css  js  c++  java
  • 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  感谢航哥

  • 相关阅读:
    Nodejs下载和第一个Nodejs示例
    永久关闭Win10工具栏的TaskbarSearch控件
    对称加密,非对称加密,散列算法,签名算法
    【转】TTL和RS232之间的详细对比
    zlg核心板linux系统中查看系统内存等使用信息
    Power BI后台自动刷新数据报错 The operation was throttled by Power BI Premium because there were too many datasets being processed concurrently.
    剪切板和上传文件内容获取
    CSS, LESS, SCSS, SASS总结
    文字程序
    electron 打包“ERR_ELECTRON_BUILDER_CANNOT_EXECUTE”
  • 原文地址:https://www.cnblogs.com/hero11223/p/5689074.html
Copyright © 2011-2022 走看看