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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top