4

如何获取当前位于其窗口列表顶部的 Finder 窗口的 POSIX 路径?最好使用某种 Cocoa 框架,但我对任何事情都持开放态度。

背景:我需要这个,因为我想选择匹配正则表达式模式的文件,从这个路径开始递归。这个想法是使用

[[NSWorkspace sharedWorkspace] subpathsAtPath:thePath]

获取此路径的所有后代的方法,在 NSTask 中使用“grep”(以避免打包正则表达式支持框架)并使用

[[NSWorkspace sharedWorkspace] selectFile:aFile inFileViewerRootedAtPath:thePath]

在一个循环中循环通过由 grep 返回的条目组成的 NSArray。

到目前为止,我已经查看了 NSWorkspace、NSFileManager 和 NSApplication 以及 Xcode 文档中的其他关键字搜索。

感谢您查看我的问题!

安德烈

PS:我不确定 grep 部分,也许我会在那里拍一下 RegexKit Lite ......

4

4 回答 4

5

您可能可以通过 AppleScript 询问 Finder。

这个*单线对我有用:

osascript -e 'tell application "Finder" to set myname to POSIX path of (target of window 1 as alias)'

*此的修改版本。

于 2009-06-26T12:25:26.073 回答
3

我正在开发一个完全符合您描述的商业应用程序,并且一年多来我一直在用不同的方式来做这件事。我是一名新手开发人员,所以我完全接受这样的想法,即可能有比我的方式更好的方法,但它似乎稳定且有效。

我使用 Apple 脚本

我每 3 秒获取一次活动文档的路径,但如果活动应用程序是 Finder,我将获取活动窗口的路径。我使用 Apple Script 执行此操作,如接受的答案所述。

使用 Carbon 获取窗口列表

要获取所有进程的窗口列表以获取窗口 ID(Apple 脚本无法做到),我使用 CGWindowListCopyWindowInfo ,如本问题所述:

获取另一个应用程序窗口的唯一 ID

这为我提供了一个数组,其中包含最前面排序的所有进程的所有窗口。所以我需要做的就是从数组中取出第一个条目。如果这对您有帮助,这也可用于获取前窗的屏幕抓图,如“抓取之子”示例应用程序中所示,它作为一个工作示例对我来说非常宝贵。

从 Cocoa 发送 Apple 脚本

当谈到 Apple Script 时,我已经对 Jim 建议的所有 3 个进行了试验,我的结论是每个都有它的问题,无论是在稳定性和灵活性方面。

  1. Apple 事件管理器依赖于您发送原始 Apple 事件。对我来说,这太像努力工作,太低级了。

  2. 我发现使用 NSAppleScript 很慢并且容易出错。当你想像我一样发送各种各样的 Apple Script 消息时,它也很笨拙。

  3. 在阅读有关 Scripting Bridge 的内容时,我非常兴奋,但尝试它却非常失望。对于我试图抓取的窗口的属性,它甚至没有将它们识别为存在。在我看来,这似乎是错误的和奇怪的。我希望如果 SB 支持您发送的命令,那将是最佳选择。

第四种选择

我现在依赖于 Apple Script 周围的一个神话般的 Objective C 包装器,称为AppScript。它已经存在很多很多年了,它很稳定,开发人员很棒,而且最重要的是它可以正常工作。

它具有坚如磐石的方法,允许您发送 Apple 脚本,它甚至可以巧妙地为您返回错误,而无需检查一大堆可能存在错误和混乱的代码。

我已经使用它一年了,没有任何问题。如果您对如何执行此操作有任何其他问题,请随时发表评论,我会尽力回答。

于 2009-10-16T10:37:24.377 回答
2

获取 Finder 中最前面的窗口表示的 POSIX 路径将涉及以一种或另一种方式将 Apple 事件发送到 Finder。

您的选择包括:

  • 直接使用 Apple 事件管理器(或 NSAppleEventDescriptor 和朋友)。
  • 使用 NSAppleScript 或 OSAScript 对象。
  • 使用 ScriptingBridge。

如果您正在构建 Cocoa 应用程序,OSAScript 可能是最自然的选择。

于 2009-06-26T15:29:09.663 回答
1

可以使用ScriptingBridgeSwift 4

import Foundation
import ScriptingBridge // imports: ScriptingBridge.SBApplication, .SBElementArray, .SBObject

// SBApplication? to SBApplication to FinderApplication
let finder = (SBApplication(bundleIdentifier: "com.apple.finder")!) as FinderApplication

let windowList: SBElementArray = finder.windows!()
guard windowList.count > 0,
    let window = windowList[0] as? FinderWindow,
    let windowProperties = window.properties,
    let windowTarget = windowProperties["target"] as? FinderFolder,
    let windowUrlOptionalStr = windowTarget.URL,
    let windowUrlSubStr = windowUrlOptionalStr
        .removingPercentEncoding?
        .dropFirst(7) // "file://" 7 characters
else {
    // … handle failure
}

let windowUrl = URL(
    fileURLWithPath: String(windowUrlSubStr),
    isDirectory: true,
    relativeTo: nil)
于 2019-03-01T21:53:43.520 回答