如何在运行时以编程方式确定给定路径是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;
答案 0 :(得分:3)
如果有人从谷歌搜索中发现了这一点,这里有一些来自Apple的有用信息:
有多种方法可以测试卷是否为网络卷。最好的使用方法取决于您正在使用的图层:
如果您正在处理常规应用程序代码,则应使用NSURL。构造卷上任何项的URL,然后调用-getResourceValue:forKey:error:获取NSURLVolumeIsLocalKey键;网络卷的返回值为false(kCFBooleanFalse),本地卷的返回值为true(kCFBooleanTrue)。
如果您正在BSD层编程,则可以调用statfs并测试它返回的f_flags字段中的MNT_LOCAL标志。或者,您可以调用getattrlist来请求ATTR_VOL_MOUNTFLAGS属性,在某些情况下这可能比statfs更有效。
答案 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类。