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

2017-06-11  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读