@@ -26,6 +26,7 @@ class FileDownloadTask: ObservableObject {
2626 let savedFileLocation : URL
2727 let fileName : String
2828 var error : Error ?
29+ var beforeSave : ( ( URL ) -> URL ? ) ?
2930 var afterDownload : ( ( FileDownloadTask ) -> Void ) ?
3031
3132 @Published var state : State = . idle
@@ -34,11 +35,13 @@ class FileDownloadTask: ObservableObject {
3435 task. progress
3536 }
3637
37- init ( task: URLSessionDownloadTask , fileName: String , savedFileLocation: URL , afterDownload: ( ( FileDownloadTask ) -> Void ) ? = nil ) {
38+ init ( task: URLSessionDownloadTask , fileName: String , savedFileLocation: URL ,
39+ beforeSave: ( ( URL ) -> URL ? ) ? = nil , afterDownload: ( ( FileDownloadTask ) -> Void ) ? = nil ) {
3840 self . task = task
3941 self . savedFileLocation = savedFileLocation
4042 self . fileName = fileName
4143 self . error = nil
44+ self . beforeSave = beforeSave
4245 self . afterDownload = afterDownload
4346 }
4447
@@ -65,15 +68,19 @@ final class FileDownloadManager: NSObject {
6568 }
6669
6770 func schedule( with request: URLRequest , fileName: String , saveLocation: URL ? = nil ,
68- afterDownload: ( ( FileDownloadTask ) -> Void ) ? = nil ) -> FileDownloadTask {
71+ beforeSave : ( ( URL ) -> URL ? ) ? = nil , afterDownload: ( ( FileDownloadTask ) -> Void ) ? = nil ) -> FileDownloadTask {
6972 let downloadTask = session. downloadTask ( with: request)
7073 let fileURL : URL
7174 if let saveLocation = saveLocation {
7275 fileURL = saveLocation
7376 } else {
7477 fileURL = Self . downloadDirectoryURL. appendingPathComponent ( fileName)
7578 }
76- let fileDownloadTask = FileDownloadTask ( task: downloadTask, fileName: fileName, savedFileLocation: fileURL, afterDownload: afterDownload)
79+ let fileDownloadTask = FileDownloadTask ( task: downloadTask,
80+ fileName: fileName,
81+ savedFileLocation: fileURL,
82+ beforeSave: beforeSave,
83+ afterDownload: afterDownload)
7784 tasks [ fileDownloadTask. id] = fileDownloadTask
7885 return fileDownloadTask
7986 }
@@ -87,13 +94,16 @@ extension FileDownloadManager: URLSessionDownloadDelegate {
8794 return
8895 }
8996
90- let desiredUrl = task. savedFileLocation
97+ let sourceFile = task. beforeSave ? ( location) ?? location
98+
99+ let savingLocation = task. savedFileLocation
100+
91101 do {
92- let isFileExists = FileManager . default. fileExists ( atPath: desiredUrl . path)
102+ let isFileExists = FileManager . default. fileExists ( atPath: savingLocation . path)
93103 if isFileExists {
94- _ = try FileManager . default. replaceItemAt ( desiredUrl , withItemAt: location )
104+ _ = try FileManager . default. replaceItemAt ( savingLocation , withItemAt: sourceFile )
95105 } else {
96- try FileManager . default. moveItem ( at: location , to: desiredUrl )
106+ try FileManager . default. moveItem ( at: sourceFile , to: savingLocation )
97107 }
98108 task. state = . saved
99109 task. afterDownload ? ( task)
0 commit comments