【问题标题】:Launch Finder window with specific files selected启动 Finder 窗口并选择特定文件
【发布时间】:2011-11-30 23:05:41
【问题描述】:

我正在尝试以编程方式从 Xcode 项目启动 OS X Finder 窗口。我需要打开特定文件夹的窗口,并自动选择该文件夹中的特定文件。

这类似于 Xcode 和相关应用程序中使用的“在 Finder 中显示”功能。

有谁知道如何在 Objective-C、Swift、AppleScript 或 Finder 命令行参数中执行此操作?

【问题讨论】:

标签: objective-c macos applescript finder


【解决方案1】:

在 Finder 中显示多个文件

open -R <path-to-reveal> 仅适用于单个文件。 我们可以使用 Apple Script。

从用户866649的answer,我们可以将它移植到一个shell脚本,如下所示:

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 并选择下载和桌面文件夹。

【讨论】:

    【解决方案2】:

    Swift 版本:

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

    【讨论】:

      【解决方案3】:

      Swift 3.2/4.0 版本:

      NSWorkspace.shared.activateFileViewerSelecting([outputFileURL])
      

      【讨论】:

        【解决方案4】:

        我发现 activateFileViewerSelectingURLs 在 Yosemite 上不起作用(至少在与 Finder 分开的空间中时)。它会导致切换到 Finder 的空间,但似乎不会选择 URL。使用:

        - `(BOOL)selectFile:(NSString *)fullPath inFileViewerRootedAtPath:(NSString *)rootFullPath` 
        

        将从全屏应用切换空间并选择路径。

        【讨论】:

        • 这应该是对已接受解决方案的评论?
        【解决方案5】:

        另一种 AppleScript 风格 - Finder 的 reveal 命令将打开包含文件夹的窗口并选择项目。如果有多个包含文件夹,则会打开多个 Finder 窗口。

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

        【讨论】:

          【解决方案6】:

          path打开文件时:

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

          【讨论】:

            【解决方案7】:
            $ open -R <path-to-reveal>
            

            【讨论】:

            • 这适用于单个文件,但不适用于多个文件:open -R foo.jpg bar.jpg 不会同时选择 foo.jpgbar.jpg
            【解决方案8】:

            Objective-C 版本:

            NSArray *fileURLs = [NSArray arrayWithObjects:fileURL1, /* ... */ nil];
            [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:fileURLs];
            

            【讨论】:

            • 我很好奇为什么这被否决了;这正是提问者所要求的。
            • 效果很好。我唯一的评论是该数组是 NSUrl 的数组。考虑到数组的名称是“fileURL's”,这似乎很明显,但我出于某种原因将 NSString 与路径一起放入,并且崩溃得相当壮观。而是从路径字符串 (NSURL* url = [NSURL fileURLWithPath:fileToShow isDirectory:dir];) 构造一个 NSUrl,然后将其包含在数组中效果很好。
            猜你喜欢
            • 1970-01-01
            • 2017-01-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-03
            • 1970-01-01
            相关资源
            最近更新 更多