demo只是验证想法,没有做很多异常处理
- 默认文件是大于1KB的,对于小于1KB的没有做异常处理
- demo中文件只能分割成2个,可以做成可配置的N个文件分割
- 拼接还可以使用固定的二进制数据,拼接文件开头或结尾
- 不论哪种拼法,目的都是使这个文件无法单独使用,必须组合使用,而组合的算法是只有自己知道的
- 对纯文本的分割,起不到加密的作用,拿到单独的文件还是能拼接处完成内容
- 思路:1.可以对文本内容进行一次AES加密
- 2.然后在分割文件,
- 3.合并文件完成后,
- 4.在进行AES解密,获取原始内容
外界调用:
let tool = FIleMergeTool(path: "/Users/zwyl/Desktop/bigImage.png")if let data = tool.divideFile() {let image = UIImage.init(data: data)self.baseImage.image = image
}if let data = tool.mergeFile() {let image = UIImage.init(data: data)self.imageView.image = image
}
核心实现:
import Foundationclass FIleMergeTool: NSObject {var path: Stringlet prePath = "/Users/zwyl/Desktop/dividerF_file1"let lastPath = "/Users/zwyl/Desktop/dividerF_file2"init(path: String) {self.path = pathsuper.init()}struct Const {// firstOffset 一定要 >= lastBeginstatic let firstOffset = 1024static let lastBegin = 1000}func divideFile() -> Data? {let url = URL(filePath: self.path)let preUrl = URL(filePath: prePath)let lastUrl = URL(filePath: lastPath)let data = try? Data(contentsOf: url)guard let data else {return nil}try? FileManager.default.removeItem(at: preUrl)try? FileManager.default.removeItem(at: lastUrl)// 获取第一部分let preRange = 0 ..< Const.firstOffsetlet preData = data.subdata(in: preRange)try? preData.write(to: preUrl)// 获取第二部分let lastRange = Const.lastBegin ..< data.countlet lastData = data.subdata(in: lastRange)try? lastData.write(to: lastUrl)return data}// 重新读取文件, 拼接Datafunc mergeFile() -> Data? {let preUrl = URL(filePath: self.prePath)let lastUrl = URL(filePath: self.lastPath)let preData = try? Data(contentsOf: preUrl)guard let preData else {return nil}let lastData = try? Data(contentsOf: lastUrl)guard let lastData else {return nil}// 拼接第一段数据var resultData = Data()resultData.append(preData)// 拼接第二段数据let begin = Const.firstOffset - Const.lastBeginlet otherData = lastData.subdata(in: begin ..< lastData.count)resultData.append(otherData)return resultData}
}
删除重复部分后,继续拼接 ,即可得到原始文件。