从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
我已经构建了一个 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