在Swift中,您可以使用GCD(Grand Central Dispatch)来实现异步调用和添加完成处理程序。下面是一个优雅的解决方案:
import Foundation
func copyFolderRecursively(atPath sourcePath: String, toPath destinationPath: String, completion: @escaping () -> Void) {
DispatchQueue.global().async {
do {
let fileManager = FileManager.default
let sourceURL = URL(fileURLWithPath: sourcePath)
let destinationURL = URL(fileURLWithPath: destinationPath)
try fileManager.createDirectory(at: destinationURL, withIntermediateDirectories: true, attributes: nil)
let fileURLs = try fileManager.contentsOfDirectory(at: sourceURL, includingPropertiesForKeys: nil)
for fileURL in fileURLs {
let destinationFileURL = destinationURL.appendingPathComponent(fileURL.lastPathComponent)
try fileManager.copyItem(at: fileURL, to: destinationFileURL)
if fileManager.fileExists(atPath: fileURL.path) && fileManager.fileExists(atPath: destinationFileURL.path) {
try fileManager.removeItem(at: fileURL)
}
}
DispatchQueue.main.async {
completion()
}
} catch {
print("Error copying folder: \(error)")
}
}
}
// 使用示例
copyFolderRecursively(atPath: "/path/to/source/folder", toPath: "/path/to/destination/folder") {
print("Folder copied successfully!")
}
在上面的示例中,copyFolderRecursively
函数使用GCD在后台线程执行文件夹复制操作。完成后,它会在主线程上调用传递的完成处理程序。
这个解决方案使用了FileManager
来处理文件和文件夹的操作。它首先创建目标文件夹,然后递归地复制源文件夹中的所有文件和子文件夹。复制完成后,它会删除源文件夹中的文件(如果复制成功)。
这是一个优雅的解决方案,因为它使用了异步调用和GCD来确保文件夹复制操作不会阻塞主线程,并且在完成后调用了传递的完成处理程序。
腾讯云相关产品和产品介绍链接地址:
请注意,以上链接仅供参考,具体产品选择应根据实际需求进行评估和决策。
领取专属 10元无门槛券
手把手带您无忧上云