Mac OS: 直接从 Swift 中的目录访问内容

Mac OS: Accessing contents directly from a directory in Swift

我是 mac OS 开发人员的新手,所以请原谅我的任何基本问题,但相信我,我已经做了很多研究,但仍然有点卡住了。

所以我正在尝试访问当前用户桌面的内容。

在 playground 中很简单,只需使用

let homeURL = FileManager.default.homeDirectoryForCurrentUser
let desktopURL = homeURL.appendingPathComponent("Desktop/")
let contents = try fileManager.contentsOfDirectory(atPath:desktopURL.path)

显示桌面上的所有内容。 但是当我在一个项目中运行类似的代码。

let homeURL = FileManager.default.homeDirectoryForCurrentUser

它 returns 我的应用程序容器。

file:///Users/myUserName/Library/Containers/AppIdentifier/Data/

let contents = try fileManager.contentsOfDirectory(atPath: desktopURL.path) 不返回任何内容。

嗯,那我就用

deletingLastPathComponent

在获取我的 URL 到我的用户名

的主页路径时
let homeURL = FileManager.default.homeDirectoryForCurrentUser.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent()

当我调试它时,它 returns

file:///Users/myUserName

如我所愿。但是当我 运行 代码时,内容变量仍然是零。

下一次尝试:

我在互联网上搜索以检查获取目录路径的替代方法。 所以我遇到了

NSOpenPanel

我从 Panel 获取 URL 个文件夹并使用 url 检查其中的内容。 工作正常

这是

的代码

func buttonClicked(_ sender : Any){
guard let window = view.window else {return}

        let panel = NSOpenPanel()
        panel.canChooseFiles = false
        panel.canChooseDirectories = true
        panel.allowsMultipleSelection = false

        panel.beginSheetModal(for: window) { (result) in
            if result.rawValue == 1{
                let folderURL = panel.urls[0]
                print(folderURL)

                let contents = self.contentsOf(folder: folderURL)
                contents.forEach{
                    print([=16=].absoluteString)
                }
            }
        }
        }
 
     func contentsOf(folder: URL) -> [URL] {
        
        print("folder path = \(folder.path)")
        let fileManager = FileManager.default
        do {
            let contents = try fileManager.contentsOfDirectory(atPath: folder.path)
            let urls = contents
                .filter { return [=16=].first != "." }
                .map { return folder.appendingPathComponent([=16=]) }
            return urls
        } catch {
            return []
        }
    }

但我不明白为什么我不能直接访问内容。 我试过很多次了。在一个项目中,我无法enter code here直接从(某种)硬编码的 URL.

中获取内容

如果需要任何其他信息,请告诉我。

显然,该应用程序是沙盒,默认情况下处于启用状态。

如果启用App Sandbox,您只能以编程方式访问应用程序容器中的目录。这是一个有意的限制。访问常用主文件夹中标准目录之一的唯一方法是 com.apple.security.files.user-selected.read-write 权限和 NSOpen-/SavePanel.

请阅读App Sandbox Design Guide

如果您不打算在 App Store 中发布应用程序并且不需要沙盒,请将其禁用。