2

一部のファイルを特定の場所にコピーするアプリケーションを作成しています。これにより、ユーザーは常にAFP共有上にある宛先を選択できます。これはNSOpenPanelを使用して行われます。返されるURLは次のとおりfile://localhost/Volumes/Oliver%20Legg's%20Backup/です。

私が達成したいのは、アプリケーションの起動時に、AFP共有がマウントされていない場合は、自動的にマウントすることです。これを行うための最良の方法は何ですか?

Get Infoコマンドは、サーバーを次のようにリストしますafp://Power Mac G5._afpovertcp.local/Oliver%20Legg's%20Backup。このURLをファイルURLからプログラムで取得するにはどうすればよいですか?そのURLを取得できれば、FSMountServerVolumeAsyncを使用してマウントできると思います。それは使用するのに最適な(最も簡単で、最も抽象化された)APIですか?

4

1 に答える 1

6

この情報を取得するには、いくつかの下位レベルのファイル マネージャー ルーチンを使用する必要があります。通常の Cocoa 呼び出しでそれを行う方法はありません。URL は以下を使用しFSCopyURLForVolume()て取得されますが、それを使用するには、マウントされたボリュームのボリューム参照番号を取得する必要があります。

#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リモートボリュームをマウントする正しい方法です。

于 2010-02-12T15:24:37.077 に答える