在 Swift 的应用程序支持中创建嵌套目录

Posted

技术标签:

【中文标题】在 Swift 的应用程序支持中创建嵌套目录【英文标题】:Create nested directory in Application Support in Swift 【发布时间】:2018-06-22 08:19:25 【问题描述】:

尝试在应用程序支持中创建嵌套目录,但失败了。我收到的错误消息是"You don’t have permission to save the file 'folder1' in the folder 'testApp'

    let path = getApplicationSupportDirectory()
    let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as! String
    let folder = path.appendingPathComponent("\(appName)/folder1", isDirectory: true)
    print("[ERR]: Folder location: \(folder.relativePath)")
    if !FileManager.default.fileExists(atPath: folder.relativePath) 
        do 
            try FileManager.default.createDirectory(atPath: folder.relativeString, withIntermediateDirectories: true, attributes: nil)
         catch 
            print("[ERR]: \(error.localizedDescription)")

        
    

文件夹位置输出正确的位置,它似乎是在“appName”中创建第一个目录。

【问题讨论】:

getApplicationSupportDirectory() 返回的是什么?尝试用FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last! 替换它?您需要对尝试写入的文件夹具有写入权限... @Michael - getApplicationSupportDirectory() 返回应用程序支持目录的绝对 URL。如何对新文件夹启用写权限? 基本上不使用relativePath / relativeString 作为文件系统URL。只需使用 path 属性。除了fileExists,建议始终使用与 URL 相关的 API。 @vadian - 更改为 path 仍然是问题。 为什么投反对票?这个问题是完全有效的,并且与嵌套目录的创建有关。 【参考方案1】:

请尝试此代码,它应该可以工作。

如果应用程序支持文件夹不存在,它使用FileManager 的API 创建它。

do 
    let applicationSupportFolderURL = try FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as! String
    let folder = applicationSupportFolderURL.appendingPathComponent("\(appName)/folder1", isDirectory: true)
    print("[ERR]: Folder location: \(folder.path)")
    if !FileManager.default.fileExists(atPath: folder.path) 
        try FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true, attributes: nil)
    
 catch  print(error) 

【讨论】:

感谢在对 try 块进行了一些安全检查后,此方法有效。 FileManager.default.urls() 不起作用的任何原因? 如果目录丢失,此 API 不会创建目录。

以上是关于在 Swift 的应用程序支持中创建嵌套目录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中创建嵌套的 [String: Anyobject]?

如何使用 Swift 4 在 iOS 9+ 中创建瀑布布局

无法从现有项目中创建桌面应用程序支持

Swift如何在临时文件夹中创建复杂的文件夹结构

为什么不能引用在Swift项目的同一目录中创建的类或结构?

Swift:如何在应用程序中创建核心数据实体 [关闭]