学校的一个项目因为需要添加解压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)
}
}
}
}
}
演示:
Demo地址:https://github.com/Franzeyang/FileManager
原作地址:https://github.com/ararog/Unrar4iOS
网友评论