Domanda

I scrivere un'applicazione per copiare alcuni file in una certa posizione. Esso consente all'utente di scegliere la destinazione, che è sempre in una condivisione AFP. Questo viene fatto con un NSOpenPanel. L'URL che viene restituito è:. file://localhost/Volumes/Oliver%20Legg's%20Backup/

Quello che voglio realizzare è quando viene avviata l'applicazione, se la condivisione AFP non è montato lo voglio montare automaticamente. Qual è il modo migliore per fare questo?

Il comando Get Info elenca il server come: afp://Power Mac G5._afpovertcp.local/Oliver%20Legg's%20Backup. Come posso programatically ottenere questo URL da un URL di file? Penso che se potessi ottenere l'URL ho potuto montarlo utilizzando FSMountServerVolumeAsync . È che la migliore (più semplice più astratta,) API da utilizzare?

È stato utile?

Soluzione

È necessario utilizzare alcune routine di livello inferiore File Manager per ottenere queste informazioni, non c'è modo di farlo con le chiamate di cacao regolari. L'URL si ottiene utilizzando FSCopyURLForVolume() ma è necessario per ottenere un numero di riferimento del volume per il volume montato al fine di usarlo:

#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 è sicuramente il modo corretto per montare un volume remoto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top