Determinar AFP share a partir de uma URL de arquivo
Pergunta
Eu escrevendo um aplicativo para copiar alguns arquivos para um determinado local. Ele permite ao usuário escolher o destino, que é sempre em um compartilhamento AFP. Isso é feito com um NSOpenPanel. O URL que será retornada é:. file://localhost/Volumes/Oliver%20Legg's%20Backup/
O que eu quero realizar é quando o aplicativo é iniciado, se o compartilhamento AFP não está montado quero que montá-lo automaticamente. Qual é a melhor maneira de fazer isso?
Os obter listas de comando Informações do servidor como: afp://Power Mac G5._afpovertcp.local/Oliver%20Legg's%20Backup
. Como posso programaticamente obter este URL a partir de uma URL de arquivo? Eu acho que se eu poderia obter esse URL eu poderia montá-lo usando FSMountServerVolumeAsync . Isso é o melhor (mais abstraída mais fácil,) API para uso?
Solução
Você precisa usar algumas rotinas de nível inferior gerenciador de arquivos para obter essa informação, não há nenhuma maneira de fazê-lo com chamadas de cacau regulares. A URL é obtida usando FSCopyURLForVolume()
mas você precisa para obter um número de referência de volume para o volume montado, a fim de usá-lo:
#import <CoreServices/CoreServices.h>
//this is the path to the mounted network volume
NSString* pathToVolume = @"/Volumes/MountedNetworkVolume/";
//get the volume reference number
FSRef pathRef;
FSPathMakeRef((UInt8*)[pathToVolume fileSystemRepresentation],&pathRef,NULL);
FSCatalogInfo catalogInfo;
OSErr osErr = FSGetCatalogInfo(
&pathRef,
kFSCatInfoVolume,
&catalogInfo,
NULL,
NULL,
NULL
) ;
FSVolumeRefNum volumeRefNum = 0;
if(osErr == noErr)
volumeRefNum = catalogInfo.volume;
//get the server URL for the volume
CFURLRef serverLocation;
OSStatus result = FSCopyURLForVolume (volumeRefNum,&serverLocation);
if(result == noErr)
NSLog(@"The server location is: %@",serverLocation);
else
NSLog(@"An error occurred: %i",result);
CFRelease(serverLocation);
FSMountServerVolumeAsync
é definitivamente a maneira correta de montar um volume remoto.