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

时间:2018-06-11 06:52:22

标签: swift xcode macos swift-playground

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

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

在操场上很容易,只需使用

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

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

let homeURL = FileManager.default.homeDirectoryForCurrentUser

它返回我的App的容器。

  

文件:///用户/名为myUsername /库/容器/ AppIdentifier /数据/

let contents = try fileManager.contentsOfDirectory(atPath: desktopURL.path)不会重新评论任何内容。

嗯,我然后使用

  

deletingLastPathComponent

获取主页路径以获取我的URL直到我的用户名

let homeURL = FileManager.default.homeDirectoryForCurrentUser.deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent().deletingLastPathComponent()

当我调试它时,它返回

  

文件:///用户/名为myUsername

我想要的。但是当我运行代码时,contents变量仍为零。

下次尝试:

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

  

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($0.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 $0.first != "." }
                .map { return folder.appendingPathComponent($0) }
            return urls
        } catch {
            return []
        }
    }

但我不明白为什么我不能直接访问内容。 我尝试了很多次。在一个项目中,我可以'enter code here直接从(某种)硬编码URL获取内容。

如果需要任何其他信息,请与我们联系。

1 个答案:

答案 0 :(得分:2)

显然,应用程序是沙箱,默认情况下已启用。

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

请阅读App Sandbox Design Guide

如果您不打算在App Store中发布该应用,并且您不需要沙盒禁用它。