问题
How can I merge files in Swift / iOS ? The FileManager
can move and copy items but I've seen nothing about merging files. I'd like to have something like
FileManager.default.merge(files: [URL], to location: URL) throws
Files can potentially be big, so I'd rather avoid having to pass their data in memory.
=== here is my own in memory merge:
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)
回答1:
Here is my own solution (thanks @Alexander for the guidance)
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()
}
}
回答2:
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/swift-merge-files