美文网首页
[swift]iOS开发:使用rar解压库Unrar4iOS遇到

[swift]iOS开发:使用rar解压库Unrar4iOS遇到

作者: 高调的菜鸟 | 来源:发表于2017-06-11 21:21 被阅读0次

    学校的一个项目因为需要添加解压rar文件功能,所以在网上找了下关于这方面的第三库,找了很长时间只发现了一个三年前的解压库 Unrar4iOS ,我相信用过的人一定都会有段痛苦的经历,先不说安装这个库就有一堆坑,里面的好几个重要的方法都用不了,而且解压得到的文件名还是乱码,折腾了很长时间在网上找了各种方法才完美解决问题。第三库可以直接从我的工程文件里拷贝出来不会有什么问题,而且完美支持64位;乱码部分我给String拓展了一个方法:

    extension String{
        func latinToGBTEncoding()->String{
            let GBTEnc = CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.GB_18030_2000.rawValue))
            let data = self.data(using: .isoLatin1)
            return String(data: data!, encoding: String.Encoding(rawValue: GBTEnc))!
        }
    }
    

    至于解压后路径的创建问题我也给这个库拓展了一个方法unRarByFranze(filePath:String,filename:String),需要传入解压文件的名字以及路径:

    extension Unrar4iOS{
        
        func unRarByFranze(filePath:String,filename:String){
            let directoryPath = filePath.replacingOccurrences(of: ".rar", with: "/")//先去掉".rar"后缀方便我们创建一个同名文件夹放置解压得到的文件
            //判断该文件夹是否存在,存在就创建一个
            if !FileManager.default.fileExists(atPath: directoryPath){
                try? FileManager.default.createDirectory(atPath: directoryPath, withIntermediateDirectories: true, attributes: nil)//创建文件夹
                //先判断是否解压成功
                if self.unrarOpenFile(filePath){
                    let files = self.unrarListFiles()//解压得到一个包含所有文件名的数组
                    for i in 0..<files!.count{
                        let name = (files?[i] as! String).latinToGBTEncoding()//这里是一个坑,解压后得到的文件名都是乱码
                        unRar_CreatDirectory(filename: name, filePath: directoryPath)//最让我头疼的地方,根据路径去一个一个创建文件夹
                        let path = directoryPath + name//拼接文件路径
                        if !FileManager.default.fileExists(atPath: path){
                            if let data = self.extractStream(files?[i] as! String){
                                FileManager.default.createFile(atPath: path, contents: data , attributes: nil)//创建文件
                            }
                        }
                    }
                }
            }
        }
        
        private func unRar_CreatDirectory(filename:String,filePath:String){
            var string = filename
            let directoryList = NSMutableArray()
            let expression = "/"//通过查找"/"的个数查找文件夹的数量,比如/1/2/3/4/5这里就有5个文件夹
            let regex = try! NSRegularExpression(pattern: expression, options: .allowCommentsAndWhitespace)
            let numberOfMatches = regex.numberOfMatches(in: string, options:.reportProgress, range: NSMakeRange(0, (string as NSString).length))//获取匹配的个数,这里其实就是表示该路径下有多少文件夹,全部都要手动创建
            if numberOfMatches != 0{
                for _ in 0..<numberOfMatches{
                    let expressionOfDir = ".+(?=/)"//匹配"/"前的文本,去掉最后的文件名;例:/1/2/3/4/5/6匹配的结果就是/1/2/3/4/5
                    let regexOfDir = try? NSRegularExpression(pattern: expressionOfDir, options: .allowCommentsAndWhitespace)
                    let directory = regexOfDir?.matches(in: string, options: .reportProgress, range: NSRange(location: 0, length: (string as NSString).length))//这里是匹配到的结果在字符串里区间值
                    //根据上边得到的区间数组截取路径,得到了最后的文件夹名字,循环截取得到所有文件夹的路径
                    string = directory!.map({(string as NSString).substring(with: $0.range)}).last!
                    directoryList.add(string)//将截取到的文件夹路径放入数组
                }
            }
            if directoryList.count != 0{
                //因为是从最后的文件夹路径开始截取,所以要用倒序
                for str in directoryList.reversed(){
                    if !FileManager.default.fileExists(atPath: filePath + (str as! String)){
                        try? FileManager.default.createDirectory(atPath: filePath + (str as! String), withIntermediateDirectories: true, attributes: nil)
                    }
                }
            }
        }
    
    }
    
    

    演示:

    QQ20170611-211552.gif
    Demo地址:https://github.com/Franzeyang/FileManager
    原作地址:https://github.com/ararog/Unrar4iOS

    相关文章

      网友评论

          本文标题:[swift]iOS开发:使用rar解压库Unrar4iOS遇到

          本文链接:https://www.haomeiwen.com/subject/myghqxtx.html