【问题标题】:How do I create a Finder alias within an application?如何在应用程序中创建 Finder 别名?
【发布时间】:2009-12-18 13:14:41
【问题描述】:

从 Cocoa 应用程序创建 Finder 别名所需的代码是什么? OS X 10.5、10.6 和 10.7 之间的代码有什么不同吗?

【问题讨论】:

  • 一种方法是将一些 AppleScript 嵌入到您的应用程序中,这具有执行此操作的功能。请参阅文档。

标签: objective-c cocoa finder


【解决方案1】:

从 OS X 10.6 开始,您可以使用 NSUrlwriteBookmarkData:toURL:options:error: 方法

来自documentation

在磁盘上的指定位置创建一个别名文件 书签数据。

示例代码:

NSURL *originalUrl = [NSURL fileURLWithPath:@"/this/is/your/path"];
NSURL *aliasUrl = [NSURL fileURLWithPath:@"/your/alias/path"];
NSData *bookmarkData = [originalUrl bookmarkDataWithOptions: NSURLBookmarkCreationSuitableForBookmarkFile includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];

if(bookmarkData != nil) {
    BOOL success = [NSURL writeBookmarkData:bookmarkData toURL:aliasUrl options:NSURLBookmarkCreationSuitableForBookmarkFile error:NULL];
    if(NO == success) {
        //error
    }
}

但是,以这种方式创建的别名不能向后兼容早期的 OS X 版本(10.6 之前)

【讨论】:

  • 因为我至少对 OS X 10.6 感兴趣,所以这就是我一直在寻找的答案。 Cocoa 应用程序中的 Carbon 代码没有任何问题,但我更喜欢尽可能使用 Cocoa。
  • 当我右键单击并说“制作别名”时会发生同样的事情吗?就像在这个屏幕截图中一样 - i.imgur.com/JEHZLcl.png
  • @kiamlaluno 和 codingFrined,第 3 行的这个 sn-p 有错字吗?它说NSData *bookmarkData = [url ,但url 是什么? url 应该是 originalURL 吗?
  • @Noitidart 是的,这是一个错字。我修好了它。感谢您指出这一点!
  • 谢谢@codingFriend1 :)
【解决方案2】:

看看How to Create an Alias Programmatically

- (void)makeAliasToFolder:(NSString *)destFolder inFolder:(NSString *)parentFolder withName:(NSString *)name
{
    // Create a resource file for the alias.
    FSRef parentRef;
    CFURLGetFSRef((CFURLRef)[NSURL fileURLWithPath:parentFolder], &parentRef);
    HFSUniStr255 aliasName;
    FSGetHFSUniStrFromString((CFStringRef)name, &aliasName);
    FSRef aliasRef;
    FSCreateResFile(&parentRef, aliasName.length, aliasName.unicode, 0, NULL, &aliasRef, NULL);

    // Construct alias data to write to resource fork.
    FSRef targetRef;
    CFURLGetFSRef((CFURLRef)[NSURL fileURLWithPath:destFolder], &targetRef);
    AliasHandle aliasHandle = NULL;
    FSNewAlias(NULL, &targetRef, &aliasHandle);

    // Add the alias data to the resource fork and close it.
    ResFileRefNum fileReference = FSOpenResFile(&aliasRef, fsRdWrPerm);
    UseResFile(fileReference);
    AddResource((Handle)aliasHandle, 'alis', 0, NULL);
    CloseResFile(fileReference);

    // Update finder info.
    FSCatalogInfo catalogInfo;
    FSGetCatalogInfo(&aliasRef, kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL);
    FileInfo *theFileInfo = (FileInfo*)(&catalogInfo.finderInfo);
    theFileInfo->finderFlags |= kIsAlias; // Set the alias bit.
    theFileInfo->finderFlags &= ~kHasBeenInited; // Clear the inited bit to tell Finder to recheck the file.
    theFileInfo->fileType = kContainerFolderAliasType;
    FSSetCatalogInfo(&aliasRef, kFSCatInfoFinderInfo, &catalogInfo);
}

你也可以使用applescript

osascript -e 'tell application "Finder" to make alias file to POSIX file "/Applications/myapp.app" at POSIX file "/Applications/"'

【讨论】:

  • 您也可以查看BDAlias library
  • 需要注意的是,这个解决方案是过时(不推荐)的方式。仅在必须时才使用它,如果可以,请使用writeBookmarkData。请参阅stackoverflow.com/questions/37309635 了解如何从别名记录创建书签文件。
【解决方案3】:

使用 Swift3 在​​磁盘上的指定位置创建一个别名文件,其中包含指定的书签数据。

示例代码:

let url = URL(string: "originalURL")
let aliasUrl = URL(string: "aliasURL")
do{
      let data = try url.bookmarkData(options: .suitableForBookmarkFile, includingResourceValuesForKeys: nil, relativeTo: nil)
            try URL.writeBookmarkData(data, to: aliasUrl)
  }catch{}

【讨论】:

    【解决方案4】:

    你想要-[NSFileManager linkItemAtPath:toPath:error:]。 AFIK、it 及其相关方法是所有版本的首选方法。

    【讨论】:

    • 别名和链接不一样吗?我想我认为 Finder 别名是链接中不存在的一些功能,这将使其比链接更可取。
    • 硬链接(作为使用报告功能创建的链接)无法在与源卷不同的卷上创建。软链接和硬链接混合的 Finder 别名,这意味着即使文件被移动,Finder 别名也将有效,并且可以在与源卷不同的卷上设置别名。跨度>
    • 硬链接没有类似于别名。硬链接文件一次将其放置在两个位置或两个不同的名称(或两者)下。它不会创建特殊类型(符号链接)或具有特殊内容(别名或书签)的新文件。
    • 这就是我询问 Finder 别名的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多