Frage

Ich habe eine Anwendung zu schreiben, einige Dateien zu einem bestimmten Ort zu kopieren. Es ermöglicht der Benutzer das Ziel zu wählen, die immer auf einer AFP-Aktie ist. Dies wird mit einem NSOpenPanel getan. Die URL, die zurückgegeben wird ist:. file://localhost/Volumes/Oliver%20Legg's%20Backup/

Was ich will, ist zu erreichen, wenn die Anwendung gestartet wird, wenn die AFP Aktie montiert ist nicht, dass ich es möge es automatisch montieren. Was ist der beste Weg, um dies?

zu tun

Die Get Info-Befehlslisten der Server als: afp://Power Mac G5._afpovertcp.local/Oliver%20Legg's%20Backup. Wie kann ich diese URL programmatisch erhalten aus einer Datei URL? Ich denke, wenn ich das URL montiere ich bekommen kann, könnte es mit FSMountServerVolumeAsync . Ist das der beste (einfachste, abstrahierte) API verwenden?

War es hilfreich?

Lösung

Sie müssen einige niedrigere Ebene File Manager Routinen verwenden, um diese Informationen zu erhalten, gibt es keine Möglichkeit, es mit regelmäßigen Cocoa Anrufen zu tun. Die URL wird mithilfe FSCopyURLForVolume() erhalten, aber Sie müssen ein Volumen Referenznummer erhalten für das Volumen montiert, um es zu benutzen:

#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 ist definitiv der richtige Weg, um einen Remote-Volume zu montieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top