2009-12-18 1 views
6

Каков код, необходимый для создания псевдонима Finder из приложения Cocoa? Существуют ли различия для этого кода между OS X 10.5, 10.6 и 10.7?Как создать псевдоним Finder в приложении?

+0

Один из способов сделать это, чтобы встроить некоторые AppleScript в ваше приложение, это имеет функции, чтобы сделать это. См. Документы. – Cocoadelica

ответ

4

Поскольку OS X 10.6 вы можете использовать NSUrl «s writeBookmarkData: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)

+0

Поскольку меня интересовала хотя бы OS X 10.6, это тот ответ, который я искал. Нет ничего плохого в коде Carbon в приложении Cocoa, но я предпочитаю использовать Cocoa, когда это возможно. – kiamlaluno

+0

Лучше поздно, чем никогда, не так ли? :-) – codingFriend1

+0

Да, это так. ':)' – kiamlaluno

-1

Вы хотите -[NSFileManager linkItemAtPath:toPath:error:]. AFIK, он и связанные с ним методы являются предпочтительным средством для всех версий.

+2

Не является ли псевдоним отличным от ссылки? Я думаю, что я прочитал псевдоним Finder как некоторые функции, которых нет в ссылке, что сделало бы предпочтительными ссылки. – kiamlaluno

+1

Жесткие ссылки (как созданные с сообщенной функцией) не могут быть созданы на томе, отличном от исходного. Искатель Finder в сочетании между мягкой ссылкой и жесткой ссылкой, что означает, что псевдоним Finder будет действителен даже при перемещении файла, и можно установить псевдоним на другой том, чем исходный том. – kiamlaluno

+1

Жесткая ссылка: * ничего, как псевдоним. Жесткая привязка файла помещает его в два места или под двумя разными именами (или обоими) сразу. Он не создает новый файл либо специального типа (символическая ссылка), либо со специальным содержимым (псевдоним или закладка). –

4

Посмотрите на 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/"' 
+0

Вы также можете проверить [BDAlias ​​library] (https://github.com/rentzsch/bdalias). –

+0

Следует отметить, что это решение является устаревшим (устаревшим) способом. Используйте это, только если нужно, и используйте 'writeBookmarkData', если сможете. См. Http://stackoverflow.com/questions/37309635/, чтобы узнать, как создать файл закладок из записи Alias. –

0

Создает файл псевдонимов на диске при заданном местоположение с заданными данными закладок с помощью 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{} 
Смежные вопросы