【问题标题】:How to get file path when opening a file from Finder从Finder打开文件时如何获取文件路径
【发布时间】:2019-12-03 06:00:31
【问题描述】:

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

【问题讨论】:

    标签: c++ macos finder


    【解决方案1】:

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

    【讨论】:

    • 这似乎是解决方案。我使用创建NSApplication:NSApplication* application = [NSApplication sharedApplication]; [application run]; 的跨平台库。如何将我的委托连接到 NSApplication?
    • 找到:MyDelegate* deleg = [MyDelegate alloc]; [NSApp setDelegate:deleg];。谢谢!
    【解决方案2】:

    @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,一切都会变得清晰。

    现在将其保存为应用程序,在此演示中,它以“Bridge.app”的形式保存在 /tmp/bridge(macOS 上为 /private/tmp/bridge)中。

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

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

    您可以在终端中使用以下方法在 Finder 窗口中打开 /tmp/bridge

    $ open /tmp/bridge
    

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

    现在试一试:在 Finder 中选择测试文件并打开它们。您应该会看到终端打开/激活并显示如下内容:

    $ 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 并将其保存在合适的位置。高温

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多