首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift -合并文件

Swift -合并文件
EN

Stack Overflow用户
提问于 2017-01-15 09:12:17
回答 2查看 2K关注 0票数 0

如何在Swift / iOS中合并文件?FileManager可以移动和复制项目,但我没有看到任何关于合并文件的内容。我想要一些像这样的东西

FileManager.default.merge(files: [URL], to location: URL) throws

文件可能会很大,所以我宁愿避免在内存中传递数据。

以下是我自己在内存中合并的===:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-15 10:56:13

这是我自己的解决方案(感谢@Alexander的指导)

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-02-15 18:36:58

代码语言:javascript
复制
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)

        }
    } 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41656808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档