質問

いくつかのファイルを特定の場所にコピーするアプリケーションを作成しています。これにより、ユーザーは宛先を選択できます。宛先は常に 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 ですか?

役に立ちましたか?

解決

この情報を取得するには、いくつかの下位レベルのファイル マネージャー ルーチンを使用する必要があります。通常の 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 これは間違いなくリモート ボリュームをマウントする正しい方法です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top