2010-02-11 3 views
2

J'écris une application pour copier certains fichiers à un certain endroit. Il permet à l'utilisateur de choisir la destination, qui est toujours sur un partage AFP. Ceci est fait avec un NSOpenPanel. L'URL renvoyée est: file://localhost/Volumes/Oliver%20Legg's%20Backup/. Ce que je veux accomplir est quand l'application est démarrée, si le partage AFP n'est pas monté je veux qu'il le monte automatiquement. Quelle est la meilleure façon de procéder?Déterminer le partage AFP à partir d'un fichier URL

La commande Lire les informations répertorie le serveur en tant que: afp://Power Mac G5._afpovertcp.local/Oliver%20Legg's%20Backup. Comment puis-je programmer cette URL à partir d'une URL de fichier? Je pense que si je pouvais obtenir cette URL, je pourrais le monter en utilisant FSMountServerVolumeAsync. Est-ce la meilleure (la plus facile, la plus abstraite) API à utiliser?

Répondre

6

Vous devez utiliser des routines Gestionnaire de fichiers de niveau inférieur pour obtenir cette information, il n'y a aucun moyen de le faire avec des appels Cocoa réguliers. L'URL est obtenue en utilisant FSCopyURLForVolume() mais vous devez obtenir un numéro de référence de volume pour le volume monté afin de l'utiliser:

#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 est certainement la bonne façon de monter un volume à distance.

+0

Merci pour cette fonction, ça aide beaucoup! J'ai une question à ce sujet que j'ai posée ici: http://stackoverflow.com/questions/9642856/full-url-from-fscopyurlforvolume – keegan3d

Questions connexes