Какао: Как изменить место загрузки? Swift - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь загрузить файл по URL-адресу, но мне удалось это сделать, он будет загружен в каталог ~ Libray. Как изменить каталог на папку загрузок? или из каталога библиотеки.

Вот мой загрузчик файлов ...

import Foundation

class FileDownloader {

    static func loadFileSync(url: URL, completion: @escaping (String?, Error?) -> Void)
    {
        let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .allDomainsMask).first!

        let destinationUrl = documentsUrl.appendingPathComponent(url.lastPathComponent)

        if FileManager().fileExists(atPath: destinationUrl.path)
        {
            print("File already exists [\(destinationUrl.path)]")
            completion(destinationUrl.path, nil)
        }
        else if let dataFromURL = NSData(contentsOf: url)
        {
            if dataFromURL.write(to: destinationUrl, atomically: true)
            {
                print("file saved [\(destinationUrl.path)]")
                completion(destinationUrl.path, nil)
            }
            else
            {
                print("error saving file")
                let error = NSError(domain:"Error saving file", code:1001, userInfo:nil)
                completion(destinationUrl.path, error)
            }
        }
        else
        {
            let error = NSError(domain:"Error downloading file", code:1002, userInfo:nil)
            completion(destinationUrl.path, error)
        }
    }

    static func loadFileAsync(url: URL, completion: @escaping (String?, Error?) -> Void)
    {
        let documentsUrl =  FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!

        let destinationUrl = documentsUrl.appendingPathComponent(url.lastPathComponent)

        if FileManager().fileExists(atPath: destinationUrl.path)
        {
            print("File already exists [\(destinationUrl.path)]")
            completion(destinationUrl.path, nil)
        }
        else
        {
            let session = URLSession(configuration: URLSessionConfiguration.default, delegate: nil, delegateQueue: nil)
            var request = URLRequest(url: url)
            request.httpMethod = "GET"
            let task = session.dataTask(with: request, completionHandler:
            {
                data, response, error in
                if error == nil
                {
                    if let response = response as? HTTPURLResponse
                    {
                        if response.statusCode == 200
                        {
                            if let data = data
                            {
                                if let _ = try? data.write(to: destinationUrl, options: Data.WritingOptions.atomic)
                                {
                                    completion(destinationUrl.path, error)
                                }
                                else
                                {
                                    completion(destinationUrl.path, error)
                                }
                            }
                            else
                            {
                                completion(destinationUrl.path, error)
                            }
                        }
                    }
                }
                else
                {
                    completion(destinationUrl.path, error)
                }
            })
            task.resume()
        }
    }
}

Я взглянул на код и думаю, что он должен что-то делать с этим

 let documentsUrl = FileManager.default.urls(for: .documentDirectory, in: .allDomainsMask).first!

        let destinationUrl = documentsUrl.appendingPathComponent(url.lastPathComponent)

Я пробовал изменяя код с documentDirectory на desktopDirectory, но при этом он все равно помещается в каталог библиотеки. Как мне изменить его из каталога библиотеки в каталог загрузок?

1 Ответ

1 голос
/ 30 мая 2020

Вы используете изолированное приложение. Каталоги Appname/Data/... являются псевдонимами реальных каталогов.

Кроме того, вы должны использовать userDomainMask вместо allDomainsMask для поиска пути в домашнем каталоге пользователя. Правильный каталог, который вы ищете: downloadsDirectory.

let downloadsUrl = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first!
let destinationUrl = downloadsUrl.appendingPathComponent(url.lastPathComponent)

Есть еще одна ветка SO о изолированных каталогах:
как получить / Users / username / Downloads путь в изолированном приложении ?

...