Копирование удаленного файла во временный ios файл выдает ошибку: файл существует - PullRequest
0 голосов
/ 06 мая 2020

Я загружаю файл Excel по URL-адресу и пытаюсь скопировать файл Excel в локальный временный файл. Путь к временному файлу каждый раз уникален, потому что временный каталог дает уникальный путь на основе строки UUID.

Например, в первый раз путь:

file: /// private / var / mobile / Containers / Data / Application / FCA022DB-3B65-499E-9F91 -190E307285B0 / tmp / WindData.csv

Второй раз путь отличается:

/ private / var / mobile / Containers / Data / Application / 6CB02402-837D -4952-8C56-58572705B0AD / tmp / WindData.csv

Но я получаю сообщение об ошибке «Файл существует» второй раз, хотя путь уникален. Поэтому проверьте, существует ли файл с помощью FileManager.default.fileExists, и, если он обнаружен, я удаляю путь к файлу. Эта проверка возвращает ложь, как будто файл не существует, но в следующей строке. Когда я пытаюсь скопировать целевой файл в целевой URL-адрес (поскольку он не существует из предыдущей строки), выдается ошибка:

«Ошибка: Error Domain = NSCocoaErrorDomain Code = 516» «CFNetworkDownload_oHoanb.tmp» не может быть скопирован в «tmp», поскольку элемент с таким именем уже существует. «UserInfo = {NSSourceFilePathErrorKey = / private / var /mobile/Containers/Data/Application/DB863D34-3F66-45C8-B129-76DB6FC61D0E/tmp/CFNetworkDownload_oHoanb.tmp, NSUserStringVariant = (Копировать), NSDestinationFilePath = / DB / var / mobile / Application66-63 / Data66-3 / Data66 / Data 45C8-B129-76DB6FC61D0E / tmp / WindData.csv, NSFilePath = / private / var / mobile / Containers / Data / Application / DB863D34-3F66-45C8-B129-76DB6FC61D0E / tmp / CFNetworkDownload_oHoanb.tmp / CFNetworkDownload_oHoanb.tmp, Error1 NSPOSIXErrorDomain Code = 17 "Файл существует"}} "

Как это исправить?

 let datadownloadTask = URLSession.shared.downloadTask(with: vendorURL!, completionHandler: { (responseUrl, response, error) in
        do {
            if let tempUrl = responseUrl {
                if let statusCode = (response as? HTTPURLResponse)?.statusCode {
                    print("Successfully downloaded. Status code: \(statusCode)")
                }

                do {
                    let targetUrl = self.copyResourcetoTempFile(sourceUrl: tempUrl, resourceName: "WindData", fileExtension: "csv")
                    if let destUrl = targetUrl {
                        let data = try String(contentsOfFile: destUrl.absoluteString!, encoding: .utf8)
                        let avg = self.parseCsv(data: data)
                        self.avg = avg
                    }

                } catch (let writeError) {
                    print("Error creating a file \(tempUrl) : \(writeError)")
                }

                completion(self.avg)
            }
        } catch {
            print("error: \(error.localizedDescription)")
        }
    })
    datadownloadTask.resume()
}

public func copyResourcetoTempFile(sourceUrl: URL, resourceName: String, fileExtension: String) -> NSURL?
{
    let tempDirectoryURL = NSURL.fileURL(withPath: NSTemporaryDirectory(), isDirectory: true)
    let targetUrl = tempDirectoryURL.appendingPathComponent(resourceName).appendingPathExtension(fileExtension)
    do {
        if FileManager.default.fileExists(atPath: targetUrl.absoluteString) {
           try FileManager.default.removeItem(at: targetUrl)
        }
        try FileManager.default.copyItem(at: sourceUrl, to: targetUrl)
        return targetUrl as NSURL
    } catch let error {
        NSLog("Error: \(error)")
    }
    return nil
}

1 Ответ

0 голосов
/ 06 мая 2020

Вы делаете очень частую ошибку:

путь URL-адреса файловой системы равен path, а не absoluteString, последний представляет собой весь URL-адрес, включая схему.

if FileManager.default.fileExists(atPath: targetUrl.path) {

И нет причин использовать NSURL в Swift

let tempDirectoryURL = URL(fileURLWithPath: NSTemporaryDirectory(), isDirectory: true)
...