首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程的方式知道在Mac中使用目标c是否启用了文件共享?

如何以编程的方式知道在Mac中使用目标c是否启用了文件共享?
EN

Stack Overflow用户
提问于 2016-02-18 08:09:15
回答 3查看 478关注 0票数 1

我已经用了2天的时间来用目标C找到文件共享的状态。我们可以使用SharingPreferences使用系统首选项来启用文件共享。文件共享首选项窗格存储在/System/Library/PreferencePanes位置。我们可以从PreferencePanes类检索文件共享状态信息吗?如果那样的话,我们怎样才能找回呢?

我们能否从系统存储的plist文件中获取文件共享状态,在哪个plist文件状态中维护?

或者任何其他API的目标C,通过我们可以获得文件共享状态?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-18 09:34:50

您可以通过检查适当的ServiceManagement.framework守护进程的状态来实现这一点。

代码语言:javascript
复制
@import ServiceManagement;

NSArray  *allJobs =  (NSArray *)CFBridgingRelease(SMCopyAllJobDictionaries(kSMDomainSystemLaunchd));
NSArray  *labels = [allJobs valueForKey:@"Label"];

BOOL AFPSharingIsEnabled = [labels containsObject:@"com.apple.AppleFileServer"];
BOOL SMBSharingIsEnabled = [labels containsObject:@"com.apple.smbd"];

NSLog(@"AFPSharingIsEnabled: %d - SMBSharingIsEnabled: %d", AFPSharingIsEnabled, SMBSharingIsEnabled);

SMCopyAllJobDictionaries传递kSMDomainSystemLaunchd与shell中的sudo launchctl list类似。

虽然SMCopyAllJobDictionaries是不推荐的,但是没有替换,该API在El Capitan中工作。

票数 0
EN

Stack Overflow用户

发布于 2016-02-18 08:52:18

我不认为有一个直接的api来获得这种状态,但它可以通过其他方式获得。

  1. 检查端口548和445是否已打开。548是用于AFP,目前没有使用,但当您打开文件共享,它也打开AFP。445是新的SMB共享端口。
  2. 使用NSNetServiceBrowser,您可以检查广告_afpovertcp._tcp的计算机列表。或_smb._tcp.服务,并查看您的计算机是否在其中。您可以使用IP或计算机名来确定这一点。
票数 1
EN

Stack Overflow用户

发布于 2018-03-29 20:59:44

我以上建议的快速而肮脏的实施。基本上,我想要快速确定(在1秒或更短的时间内)哪一个尝试先挂载,法新社或smb。

注意,这些对象/类是特定于我的实现的:

代码语言:javascript
复制
// my specific server implementation details
MboxObject *mbox = [RemoteFileManager mboxForHostString: [aNetService name]];

task.targetServerName

NSString *挂载NSString

代码语言:javascript
复制
static BOOL hasAfp;
static BOOL hasSmb;
// delegate callback
- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
{
   MboxObject *mbox = [RemoteFileManager mboxForHostString: [aNetService name]];
   if ( mbox && netServiceMboxName && [[mbox name] isEqualToString:netServiceMboxName] )
   {
      if ( [[aNetService type] rangeOfString:@"_afpovertcp"].length )
         hasAfp = YES;
      if ( [[aNetService type] rangeOfString:@"_smb"].length )
         hasSmb = YES;

   }
}

开始服务..。

代码语言:javascript
复制
  /////////////////////////// AFP or SMB? //////////////////////////////////
  // quickly determine if afp or smb is enabled
  if ( !mountedBasePath && task.targetServerName )
  {
     netServiceMboxName = [task.targetServerName copy];
     if ( !netServiceBrowserAfp )
     {
        netServiceBrowserAfp = [[NSNetServiceBrowser alloc] init];
        if ( !netServices )
           netServices = [[NSMutableArray alloc] init];
        [netServiceBrowserAfp setDelegate:self];

        netServiceBrowserSmb = [[NSNetServiceBrowser alloc] init];
        if ( !netServices )
           netServices = [[NSMutableArray alloc] init];
        [netServiceBrowserSmb setDelegate:self];
     }
     hasAfp = hasSmb = NO;
     [netServiceBrowserAfp searchForServicesOfType:@"_afpovertcp._tcp." inDomain:@""];
     [netServiceBrowserSmb searchForServicesOfType:@"_smb._tcp." inDomain:@""];

     for (int i = 0; i < 10; i++ )  // afp is preferred over smb because it is less restrictive (no date/clock restriction)
     {
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
        if (hasAfp) break;
     }
     NSLog( @"hasAfp %d hasSmb %d", hasAfp, hasSmb );
     if ( hasSmb && !hasAfp )
        tryingAfp = NO; // don't bother trying afp if only smb found

     [netServiceBrowserAfp stop];
     [netServiceBrowserSmb stop];
     /////////////////////////// AFP or SMB? ///////////////////////////////
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35475988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档