4

如何在运行时以编程方式确定给定路径是 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

4 回答 4

3

万一有人从谷歌搜索中偶然发现了这个,这里有一些来自苹果的有用信息:

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

如果您正在处理通用应用程序代码,则应为此使用 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

于 2015-01-27T03:43:52.713 回答
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;
}
于 2015-01-27T05:01:47.587 回答
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");
}
于 2013-10-18T13:10:50.223 回答
0

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

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

于 2013-10-21T06:46:12.747 回答