Michael M.
Michael M.

Reputation: 2584

How to get file path when opening a file from Finder

I have built a C++ cross-platform application and am struggling with how to get it to work correctly on macOS.
So far, I'm able to run the application manually with the command open /Applications/myApp.app --args /path/to/myFile.ply.
I have associated all ply files with my application but when I double click on it in the finder, the file path is not in argv argument list.
How can I get the double-clicked file path in my application?

Upvotes: 0

Views: 405

Answers (2)

CRD
CRD

Reputation: 53000

@JWWalker has explained how to solve your problem by altering your code to cope with the macOS GUI environment. Here is a different approach which avoids messing with your C++. Pick the one that suits you needs best.

If your cross-platform application is designed to run from the shell prompt you might want to run it within the macOS Terminal app. You can do this using a small AppleScript application which accepts the file paths passed by the Finder and invokes the Terminal app to run your C++ code.

To do this open Script Editor, you will find it inside Utilities in Applications. Enter the following:

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

If you can program in C++ you can probably figure that out, if not search for AppleScript and all will become clear.

Now save this as an application, for this demo it was saved in /tmp/bridge (aka /private/tmp/bridge on macOS) as "Bridge.app".

Now create some test files with a suitable extension, e..g something like:

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

From Terminal you can open /tmp/bridge in a Finder window using:

$ open /tmp/bridge

In the Finder select any of your test files, do a Get Info and set the file to open with Bridge and then hit Change All...

Now try it: select the test files in the Finder and open them. You should see Terminal open/activate and show you something like:

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

Now edit the AppleScript to run your compiled C++ instead of echo and save it in a suitable location. HTH

Upvotes: 0

JWWalker
JWWalker

Reputation: 22707

You'll need an event loop, normally done using the NSApplicationMain function. Then you need to receive an Apple Event telling what file(s) to open. It will be much easier if you are willing to use some Objective-C or Swift, rather than pure C++. In Objective-C, you'd make an object that conforms to the NSApplicationDelegate protocol and that implements a method application:openURLs: or application:openFile:.

Upvotes: 1

Related Questions