以编程方式了解给定路径是Mac OS X上的网络路径还是本地路径

时间:2013-10-18 12:19:13

标签: macos cocoa filepath core-foundation

如何在运行时以编程方式确定给定路径是Mac OS X上的网络路径还是本地路径?

例: 1. / Volumes / abc / xyz(使用smb挂载) 2. ../test/pqr(应用程序在共享网络路径上,因此当前工作目录也是网络路径,因此相对路径也是网络路径)

在Windows下面代码将确定pPath是否是网络共享路径(如* 1. \ TallyDT100 \ c \ test \ file.txt 2. z:\ test \ file.txt(z:映射到某个网络路径时的网络路径)。

    UNIVERSAL_NAME_INFO   * universalname   = NULL;             ///< for getting the universal path name of file on network share.
    DWORD                   retval;                             ///< for getting the return value from WNetGetUniversalName
    DWORD                   length          = MAX_PATH_LEN;     ///< length of universal name which would be made.


// The memory for getting the universal name information is allocated.
universalname = (UNIVERSAL_NAME_INFO *) Calloc (MAX_PATH_LEN * sizeof (Char));

retval = WNetGetUniversalName (pPath, UNIVERSAL_NAME_INFO_LEVEL, universalname, &length);

Free (universalname);

// NO_ERROR is returned only when it's drive mapped for shared network folder.
return (NO_ERROR == retval) ? true : false;

4 个答案:

答案 0 :(得分:3)

如果有人从谷歌搜索中发现了这一点,这里有一些来自Apple的有用信息:

  

有多种方法可以测试卷是否为网络卷。最好的使用方法取决于您正在使用的图层:

     

如果您正在处理常规应用程序代码,则应使用NSURL。构造卷上任何项的URL,然后调用-getResourceValue:forKey:error:获取NSURLVolumeIsLocalKey键;网络卷的返回值为false(kCFBooleanFalse),本地卷的返回值为true(kCFBooleanTrue)。

     

如果您正在BSD层编程,则可以调用statfs并测试它返回的f_flags字段中的MNT_LOCAL标志。或者,您可以调用getattrlist来请求ATTR_VOL_MOUNTFLAGS属性,在某些情况下这可能比statfs更有效。

https://developer.apple.com/library/mac/qa/nw09/_index.html

答案 1 :(得分:1)

您可以使用DiskArbitration

#import <DiskArbitration/DiskArbitration.h>

+(BOOL)isNetworkVolume: (NSURL *)volumeURL
{
    BOOL result = NO;
    int                 err = 0;
    DADiskRef           disk;
    DASessionRef        session;
    CFDictionaryRef     descDict;
    session = DASessionCreate(NULL);
    if (session == NULL) {
        err = EINVAL;
    }
    if (err == 0) {
        disk = DADiskCreateFromVolumePath(NULL,session,(__bridge CFURLRef)volumeURL);
        if (session == NULL) {
            err = EINVAL;
        }
    }
    if (err == 0) {
        descDict = DADiskCopyDescription(disk);
        if (descDict == NULL) {
            err = EINVAL;
        }
    }
    if (err == 0) {
        CFBooleanRef VolumeNetworkKey = CFDictionaryGetValue(descDict,kDADiskDescriptionVolumeNetworkKey);
        if (VolumeNetworkKey != NULL)
        {
            if (CFEqual(VolumeNetworkKey, kCFBooleanTrue)) {
                result = YES;
            }
        }
    }
    if (descDict != NULL) {
        CFRelease(descDict);
    }
    if (disk != NULL) {
        CFRelease(disk);
    }
    if (session != NULL) {
        CFRelease(session);
    }
    return result;
}

答案 2 :(得分:0)

检查下方如何检测机器上是否存在路径: -

NSArray *arr=NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);
NSString *str=[arr lastObject];
NSString *yourPath=[str stringByAppendingPathComponent:@"Volumes/abc/xyz"];
if([[NSFileManager defaultManager]fileExistsAtPath:yourPath])
{
    NSLog(@"This is your Local Path");
}

答案 3 :(得分:0)

您可以在NSSearchPathForDirectoriesInDomains中使用NSLocalDomainMask和NSNetworkDomainMask。

供您参考链接 - http://www.filibeto.org/unix/macos/lib/dev/documentation/Cocoa/Conceptual/LowLevelFileMgmt/LowLevelFileMgmt.pdf。这里的主题“在系统上查找目录”讨论了NSSearchPathForDirectoriesInDomains类。