Запустите окно OSX Finder с выбранными файлами

Я пытаюсь программно запустить окно OSX Finder из проекта XCode. Мне нужно, чтобы окно открывалось в определенную папку, и в ней автоматически выбирались определенные файлы.

Кто-нибудь знает, как это сделать в параметрах командной строки target c, applecript или Finder?

Спасибо!

8 ответов

Решение

Версия Objective-C:

NSArray *fileURLs = [NSArray arrayWithObjects:fileURL1, /* ... */ nil];
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:fileURLs];
$ open -R <path-to-reveal>

Другая разновидность AppleScript - команда открытия Finder откроет окно для содержащей папки и выберет элемент (ы). Если имеется несколько содержащих папок, будут открыты несколько окон Finder.

tell application "Finder" to reveal {someAlias, "path/to/POSIXfile" as POSIX file, etc}

Swift версия:

    let paths = ["/Users/peter/foo/bar.json"]
    let fileURLs = paths.map{ NSURL(fileURLWithPath: $0)}
    NSWorkspace.sharedWorkspace().activateFileViewerSelectingURLs(fileURLs)

Показать несколько файлов в Finder

В качестве open -R <path-to-reveal>работает только для одного файла. Вместо этого мы можем использовать Apple Script.

Из ответа пользователя866649 мы можем перенести его в сценарий оболочки следующим образом:

      osascript -e 'tell application "Finder" to reveal {"path/to/file1" as POSIX file, "path/to/file2" as POSIX file} activate'

Только что создал служебный скрипт:

finder.sh

      #!/usr/bin/env bash

join() {
  local d=$1 s=$2
  shift 2 && printf %s "$s${@/#/$d}"
}

lst=()
for f in "$@"; do
  lst+=("\"$f\" as POSIX file")
done
files=$(join , "${lst[@]}")

osascript -e "tell application \"Finder\" to reveal {$files} activate"

Тогда попробуйте:

      chmod +x finder.sh
./finder.sh ~/Downloads ~/Desktop

Он должен открыть Finder и выбрать папку «Загрузки» и «Рабочий стол».

Я обнаружил, что activFileViewerSelectingURLs не работает на Yosemite (по крайней мере, когда в отдельном пространстве от Finder). Это приведет к переключению в пространство Finder, но, похоже, не выберет URL. С помощью:

  • (BOOL)selectFile:(NSString *)fullPath inFileViewerRootedAtPath:(NSString *)rootFullPath

переключит пробелы из полноэкранного приложения и выберет путь.

При открытии файла в path:

NSString* path = @"/Users/user/Downloads/my file"
NSArray *fileURLs = [NSArray arrayWithObjects:[NSURL fileURLWithPath:path], nil];
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:fileURLs];

Swift 3.2/4.0 версия: NSWorkspace.shared.activateFileViewerSelecting([outputFileURL])

Другие вопросы по тегам