从Finder打开文件时如何获取文件路径

How to get file path when opening a file from Finder

我已经构建了一个 C++ 跨平台应用程序,并且正在努力解决如何让它在 macOS 上正常工作的问题。
到目前为止,我可以使用命令 open /Applications/myApp.app --args /path/to/myFile.ply.
手动 运行 应用程序 我已将所有 ply 文件与我的应用程序相关联,但是当我在查找器中双击它时,文件路径不在 argv 参数列表中。
如何在我的应用程序中获取双击文件路径?

您需要一个事件循环,通常使用 NSApplicationMain 函数完成。然后您需要接收一个 Apple 事件,告知要打开的文件。如果您愿意使用一些 Objective-C 或 Swift,而不是纯 C++,将会容易得多。在 Objective-C 中,您将创建一个符合 NSApplicationDelegate 协议并实现方法 application:openURLs:application:openFile:.

的对象

@JWWalker 已经解释了如何通过更改代码来应对 macOS GUI 环境来解决您的问题。这是一种不同的方法,可以避免弄乱你的 C++。选择最适合您的需求。

如果您的跨平台应用程序设计为 运行 来自 shell 提示,您可能希望在 macOS Terminal 应用程序中 运行 它。您可以使用小型 AppleScript 应用程序来执行此操作,该应用程序接受 Finder 传递的文件路径并调用终端应用程序以 运行 您的 C++ 代码。

为此,请打开 Script Editor,您会在 Applications 中的 Utilities 中找到它。输入以下内容:

on open passedItems
    set convertedPaths to ""
    # convert passed macOS paths to posix paths
    repeat with nextItem in passedItems
        set posixPath to the POSIX path of nextItem # convert macOS alias to posix path
        set convertedPaths to convertedPaths & " '" & posixPath & "'" # place in quotes to protect any spaces
    end repeat
    tell application "Terminal" # open (if required) and activate Terminal
        activate
        do script "echo " & convertedPaths # just run echo - use the path to your C++ binary instead
    end tell
end open

如果你会用 C++ 编程,你可能会明白这一点,如果不会搜索 AppleScript,一切都会变得清晰。

现在将其保存为应用程序,对于此演示,它在 /tmp/bridge(在 macOS 上又名 /private/tmp/bridge)中保存为 "Bridge.app"。

现在创建一些具有合适扩展名的测试文件,例如:

$ cd /tmp/bridge
$ touch a.bridgeDemo 'b c.bridgeDemo'

您可以从终端在 Finder window 中打开 /tmp/bridge,使用:

$ open /tmp/bridge

在 Finder select 任何测试文件中,执行 Get Info 并将文件设置为使用 Bridge 打开,然后点击 Change All...

现在试试:select 在 Finder 中打开测试文件。您应该会看到 Terminal open/activate 并显示如下内容:

$ echo  '/private/tmp/bridge/a.bridgeDemo' '/private/tmp/bridge/b c.bridgeDemo'
/private/tmp/bridge/a.bridgeDemo /private/tmp/bridge/b c.bridgeDemo
$

现在将 AppleScript 编辑为 运行 您编译的 C++ 而不是 echo 并将其保存在合适的位置。 HTH