Как извлечь вложенный файл с помощью FileManager?

В моем приложении я создаю эту структуру папок, как только приложение запускается в первый раз:

Введите описание изображения здесь

Я читал здесь Могу ли я сохранить абсолютный путь файла в базе данных? — что я не должен хранить абсолютный путь к каталогу или файлу. Поэтому у меня возникли проблемы с получением ссылки на последний файл, показанный на картинке выше под названием I-Want-This-File-Path.

Я мог бы получить доступ к Feedпапке на картинке выше, как так:

extension FileManager {
    /// APPLICATION SUPPORT DIRECTORY
    static func createOrFindApplicationSupportDirectory() -> URL? {
        let bundleID = Bundle.main.bundleIdentifier
        // Find the application support directory in the home directory.
        let appSupportDir = self.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)

        guard appSupportDir.count > 0 else {
            return nil
        }

        // Append the bundle ID to the URL for the Application Support directory.
        let dirPath = appSupportDir[0].appendingPathComponent(bundleID!)

        // If the directory does not exist, this method creates it.
        do {
            try self.default.createDirectory(at: dirPath, withIntermediateDirectories: true, attributes: nil)
            return dirPath
        } catch let error {
            print("Error creating Application Support directory with error: (error)")
            return nil
        }
    }

    /// FEED DIRECTORY
    static func createOrFindFeedDirectory() -> URL? {
        guard let appSupportDir = createOrFindApplicationSupportDirectory() else {
            return nil
        }

        let dirPath = appSupportDir.appendingPathComponent("Feed")

        // If the directory does not exist, this method creates it.
        do {
            try self.default.createDirectory(at: dirPath, withIntermediateDirectories: true, attributes: nil)
            return dirPath
        } catch let error {
            print("Error creating Favorites directory with error: (error)")
            return nil
        }
    }
}

Чтобы получить доступ к FileStackпапке у меня есть объект называетсяFileStack, который сохраняет часть path. Вместо сохранения абсолютного пути, я строю его во время выполнения, как так:

class FileStack {

    var title = ""
    var localDirectoryName: String?
    var files: File? // THIS OBJECT IS WHERE I WANT TO SAVE THE PATH

    // THIS IS HOW I BUILD THE URL AT RUNTIME TO GET THE PATH TO THE DIRECTORY CALLED "FILESTACK"
    var localDirectoryPath: URL? {
        guard let localDirectoryName = localDirectoryName else { return nil }
        return FileManager.createOrFindFeedDirectory()?.appendingPathComponent(localDirectoryName)
    }
}

Обратите внимание на свойство var files: File?— это пользовательский объект называетсяFile, где я хочу сохранить путь к I-Want-This-File-Pathфайлу на рисунке выше. Объект похож на так:

class File {

    dynamic var iWantThisFileName: String?

    var iWantThisFilePath: URL? {
        guard let iWantThisFileName = iWantThisFileName else { return nil }
        return /// ??? HOW DO I RETURN THE PATH HERE?
    }
}

Так что в конечном итоге я хочу быть в состоянии получить путь I-Want-This-File-Path , как так:

let fileStack = FileStack()
fileStack.file.iWantThisFilePath // This will give me the path

Есть предложения?

Обновление 1

В поддержке приложения — > com.Компания.Demoapp каталог, там будет несколько папок. Например, фид и SavedForLater, как показано здесь. Также FileStack будет иметь несколько файлов, как показано здесь.

Введите описание изображения здесь

Обновление 2

Другими словами, у меня возникли проблемы с построением пути для Fileобъекта во время выполнения.

I need to pass the FileStack‘ s localDirectoryNameto it’s nested object Filebecause the Fileobject will need that to build out it’s path at runtime. У меня есть код выше, который показывает что-то вроде этого.
Если бы это были отдельные объекты, то есть не вложенные друг в друга, я мог бы просто передать a urlследующему объекту… но так как они вложены, я застрял.


1 ответ

  1. Я думаю, что вы неправильно поняли ответ на другой вопрос.
    Вы хотите получить этот путь:

    /Library/Application Support/com.Company.DemoApp/Feed/FileStack/I-Want-This-File
    

    /Library/Application Support/ это часть, которую вы не можете сохранить нигде, и вы должны получить ее во время выполнения из FileManager. Это потому, что у вас нет контроля над этим путем, и он может измениться без вашего одобрения. Вы хотите, чтобы пути в приложении были относительно этой папки.

    com.Company.DemoApp/Feed/FileStack/I-Want-This-File это часть пути к файлу, который можно хранить в файлах базы данных / конфигурации. Этот путь изменится только тогда, когда вы измените его. Таким образом, если вы обновите приложение и измените пути, вы также можете изменить пути в базе данных.

    Это пример того, как это может быть реализовано:

    enum DataDirectoryType : String
        {
        case wantedFile = "Feed/FileStack/I-Want-This-File-Path"
        case anotherFiles = "Feed/AnotherFiles/"
    }
    
    extension FileManager {
        /// APPLICATION SUPPORT DIRECTORY
        static private func createOrFindApplicationSupportDirectory() -> URL? {
            let bundleID = Bundle.main.bundleIdentifier
            // Find the application support directory in the home directory.
            let appSupportDir = self.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    
            guard appSupportDir.count > 0 else {
                return nil
            }
    
            // Append the bundle ID to the URL for the Application Support directory.
            return appSupportDir[0].appendingPathComponent(bundleID!)
        }
    
        static func createOrFindFilePath(_ type : DataDirectoryType ) -> URL? {
            guard let appSupportDir = createOrFindApplicationSupportDirectory() else {
                return nil
            }
    
            let dirPath = appSupportDir.appendingPathComponent(type.rawValue)
    
            // If the directory does not exist, this method creates it.
            do {
                try self.default.createDirectory(at: dirPath, withIntermediateDirectories: true, attributes: nil)
                return dirPath
            } catch let error {
                print("Error creating Favorites directory with error: \(error)")
                return nil
            }
        }
    }
    
    
    let urlToWantedFile = FileManager.createOrFindFilePath(.wantedFile)