2009-12-18 5 views

risposta

4

Dal OS X 10.6 è possibile utilizzare NSUrl s' writeBookmarkData:toURL:options:error: metodo

Dal documentation:

crea un file di alias disco in una posizione specificata con i dati del segnalibro specificati.

codice di esempio:

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 
    } 
} 

Tuttavia, gli alias creati in questo modo non sono compatibili, alle versioni precedenti OS X (pre 10.6)

+0

Dato che ero interessato almeno a OS X 10.6, questa è la risposta che stavo cercando. Non c'è niente di sbagliato nel codice Carbon in un'applicazione Cocoa, ma preferisco usare Cocoa, quando possibile. – kiamlaluno

+0

Meglio tardi che mai, vero? :-) – codingFriend1

+0

Sì, è vero. ':' – kiamlaluno

-1

Si desidera -[NSFileManager linkItemAtPath:toPath:error:]. AFIK, e i suoi metodi correlati sono i mezzi preferiti in tutte le versioni.

+2

Non è un alias diverso da un collegamento? Penso di aver letto un alias del Finder come alcune funzionalità che non sono presenti in un collegamento, il che renderebbe preferibile i collegamenti. – kiamlaluno

+1

Gli hard link (come quello creato con la funzione segnalata) non possono essere creati su un volume diverso da quello di origine. Un alias Finder in un mix tra un collegamento soft e un hard link, il che significa che un alias del Finder sarebbe valido anche quando il file viene spostato, ed è possibile impostare un alias su un volume diverso rispetto al volume di origine. – kiamlaluno

+1

Un collegamento fisico è * niente * come un alias. Collegando con difficoltà un file lo si pone in due posizioni o sotto due nomi diversi (o entrambi) contemporaneamente. Non crea un nuovo file di un tipo speciale (collegamento simbolico) o di contenuti speciali (alias o segnalibro). –

4

Dai uno sguardo allo 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); 
} 

È inoltre possibile utilizzare AppleScript

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

È inoltre possibile controllare la [libreria BDAlias] (https://github.com/rentzsch/bdalias). –

+0

Va notato che questa soluzione è obsoleta (deprecata). Usalo solo se devi, e usa 'writeBookmarkData' se puoi. Consulta http://stackoverflow.com/questions/37309635/ per informazioni su come creare un file di segnalibri da un record di alias. –

0

crea un file di alias su disco in un determinato posizione con i dati dei segnalibri specificati utilizzando Swift3.

codice di esempio:

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{} 
Problemi correlati