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

Posted

技术标签:

【中文标题】Mac OS:直接从 Swift 中的目录访问内容【英文标题】:Mac OS: Accessing contents directly from a directory in Swift 【发布时间】:2018-06-11 06:52:22 【问题描述】:

我是 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

它返回我的应用程序的容器。

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

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

好吧,那我就用

删除LastPathComponent

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

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

当我调试它时,它会返回

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($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 heret 直接从(某种)硬编码的 URL 获取内容。

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

【问题讨论】:

【参考方案1】:

显然,该应用是沙盒化的,默认情况下是启用的。

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

请阅读App Sandbox Design Guide

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

【讨论】:

以上是关于Mac OS:直接从 Swift 中的目录访问内容的主要内容,如果未能解决你的问题,请参考以下文章

如何配置Mac OS X 与 Windows之间共享网络

在 Mac OS X 中访问扫描仪

如何在 Mac OS X 上监视目录中的更改?

pathForResource 在 Mac OS X 控制台应用程序中返回 nil — Swift

Mac OS 终端运行.sh脚本

MAC OS Xcode Swift 2.2 全屏模式