【问题标题】:Determine AFP share from a file URL从文件 URL 确定 AFP 共享
【发布时间】:2011-01-15 15:46:56
【问题描述】:

我编写了一个应用程序来将一些文件复制到某个位置。它允许用户选择目的地,该目的地始终位于 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 macos afp


    【解决方案1】:

    您需要使用一些较低级别的文件管理器例程来获取此信息,常规的 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 绝对是挂载远程卷的正确方法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2011-08-11
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多