如何使用 FileManager 检索嵌套文件?
How to retrieve nested file with 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
在Application Support -> com.Company.DemoApp目录下,会有多个文件夹。例如,此处显示的 Feed 和 SavedForLater。此外,FileStack 将有多个文件,如此处所示。
更新 2
换句话说,我无法在运行时为 File
对象构建路径。
我需要将 FileStack
的 localDirectoryName
传递给它的嵌套对象 File
,因为 File
对象将需要它来在运行时构建它的路径。我上面的代码显示了这样的内容。
如果这些是单独的对象,意味着没有相互嵌套,我可以简单地将 url
传递给下一个对象......但是由于它们是嵌套的,我被卡住了。
我认为你误解了其他问题的答案。
你想得到这个路径:
/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
这是您可以存储在 database/config 文件中的文件路径的一部分。此路径只有在您更改它时才会更改。因此,如果您更新应用程序并更改路径,您也可以更改数据库中的路径。
这是如何实施的粗略示例:
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)
在我的应用程序中,我会在应用程序首次启动时立即创建此文件夹结构:
我在这里读到 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
在Application Support -> com.Company.DemoApp目录下,会有多个文件夹。例如,此处显示的 Feed 和 SavedForLater。此外,FileStack 将有多个文件,如此处所示。
更新 2
换句话说,我无法在运行时为 File
对象构建路径。
我需要将 FileStack
的 localDirectoryName
传递给它的嵌套对象 File
,因为 File
对象将需要它来在运行时构建它的路径。我上面的代码显示了这样的内容。
如果这些是单独的对象,意味着没有相互嵌套,我可以简单地将 url
传递给下一个对象......但是由于它们是嵌套的,我被卡住了。
我认为你误解了其他问题的答案。 你想得到这个路径:
/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
这是您可以存储在 database/config 文件中的文件路径的一部分。此路径只有在您更改它时才会更改。因此,如果您更新应用程序并更改路径,您也可以更改数据库中的路径。
这是如何实施的粗略示例:
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)