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 Foundation
class FIleMergeTool: NSObject {
var path: String
let prePath = "/Users/zwyl/Desktop/dividerF_file1"
let lastPath = "/Users/zwyl/Desktop/dividerF_file2"
init(path: String) {
self.path = path
super.init()
}
struct Const {
// firstOffset 一定要 >= lastBegin
static let firstOffset = 1024
static 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.firstOffset
let preData = data.subdata(in: preRange)
try? preData.write(to: preUrl)
// 获取第二部分
let lastRange = Const.lastBegin ..< data.count
let lastData = data.subdata(in: lastRange)
try? lastData.write(to: lastUrl)
return data
}
// 重新读取文件, 拼接Data
func 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.lastBegin
let otherData = lastData.subdata(in: begin ..< lastData.count)
resultData.append(otherData)
return resultData
}
}
删除重复部分后,继续拼接 ,即可得到原始文件。