如何在Swift / iOS中合并文件?FileManager可以移动和复制项目,但我没有看到任何关于合并文件的内容。我想要一些像这样的东西
FileManager.default.merge(files: [URL], to location: URL) throws
文件可能会很大,所以我宁愿避免在内存中传递数据。
以下是我自己在内存中合并的===:
let data = NSMutableData()
files.forEach({ partLocation in
guard let partData = NSData(contentsOf: partLocation) else { return }
data.append(partData as Data)
do {
try FileManager.default.removeItem(at: partLocation)
} catch {
print("error \(error)")
}
})
data.write(to: destination, atomically: true)发布于 2017-01-15 10:56:13
这是我自己的解决方案(感谢@Alexander的指导)
extension FileManager {
func merge(files: [URL], to destination: URL, chunkSize: Int = 1000000) throws {
try FileManager.default.createFile(atPath: destination.path, contents: nil, attributes: nil)
let writer = try FileHandle(forWritingTo: destination)
try files.forEach({ partLocation in
let reader = try FileHandle(forReadingFrom: partLocation)
var data = reader.readData(ofLength: chunkSize)
while data.count > 0 {
writer.write(data)
data = reader.readData(ofLength: chunkSize)
}
reader.closeFile()
})
writer.closeFile()
}
}发布于 2018-02-15 18:36:58
func merge(files: [URL], to destination: URL, chunkSize: Int = 100000000) {
for partLocation in files {
// create a stream that reads the data above
let stream: InputStream
stream = InputStream.init(url: partLocation)!
// begin reading
stream.open()
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: chunkSize)
// var writeData : Data = Data()
while stream.hasBytesAvailable {
let read = stream.read(buffer, maxLength: chunkSize)
var writeData:Data = Data()
writeData.append(buffer, count: read) enter code here
if let outputStream = OutputStream(url: destination, append: true) {
outputStream.open()
writeData.withUnsafeBytes { outputStream.write($0, maxLength: writeData.count) }
outputStream.close()
writeData.removeAll()
}
}
stream.close()
buffer.deallocate(capacity: chunkSize)
}
} https://stackoverflow.com/questions/41656808
复制相似问题