【问题标题】:Check if Directory is a Mount Point in Objective C in OSX检查目录是否是 OSX 中 Objective C 中的挂载点
【发布时间】:2013-09-25 03:40:43
【问题描述】:

我正在 Objective C 中编写一个小命令行实用程序,它将检查给定路径是否是挂载点,如果不是,则将网络共享挂载到它。我打算用 bash 写这个,但选择尝试学习 Objective C。我正在寻找类似这样的Objective C:

mount | grep some_path

基本上,我可以使用一个函数来测试给定路径当前是否用作挂载点。任何帮助,将不胜感激。谢谢!

【问题讨论】:

  • -[NSFileManager mountedVolumeURLs…] 可用于枚举所有已挂载的卷,但我找不到用于挂载卷的 Objective-C API(它们可以通过 -[NSWorkspace unmount…] 卸载。你需要使用Disk Arbitration 框架,它仅导出 C API。话虽如此,根据您的要求,bash 脚本可能更容易,因为您不必担心回调和运行循环。
  • 我会看看这个。谢谢!

标签: objective-c c macos filesystems


【解决方案1】:

经过一番研究,我最终使用了这段代码,以防将来有人需要它:

        NSArray * keys = [NSArray arrayWithObjects:NSURLVolumeURLForRemountingKey, nil];
        NSArray * mountPaths = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:keys options:0];

        NSError * error;
        NSURL * remount;

        for (NSURL * mountPath in mountPaths) {
            [mountPath getResourceValue:&remount forKey:NSURLVolumeURLForRemountingKey error:&error];
            if(remount){
                if ([[[NSURL URLWithString:share] host] isEqualToString:[remount host]] && [[[NSURL URLWithString:share] path] isEqualToString:[remount path]]) {
                    printf("Already mounted at %s\n", [[mountPath path] UTF8String]);
                    return 0;
                }
            }
        }

注意,NSURL 共享作为远程共享的路径传递给函数。按 remount 键过滤会为您提供远程文件系统的安装点列表,因为本地文件系统没有该键集。

【讨论】:

  • 我在这里遗漏了一些信息 - 如果尚未安装某些内容,则 OP 想要“安装”,而我在您的代码中看不到这一点。代码中也没有记录“主机”和“共享”——我认为它们都应该是函数/方法的输入参数——你能否多说几句(也许是一个例子)来说明它们的外观像?此外,我还对本地卷(外部驱动器、密钥磁盘、CD 等)感兴趣。那么“重新安装”键是什么意思?
【解决方案2】:

迅速:

func findMountPoint(shareURL: URL) -> URL?{

    guard let urls = self.mountedVolumeURLs(includingResourceValuesForKeys: [.volumeURLForRemountingKey], options: [.produceFileReferenceURLs]) else {return nil}

    for u in urls{

        guard let resources = try? u.resourceValues(forKeys: [.volumeURLForRemountingKey]) else{
            continue
        }

        guard let remountURL = resources.volumeURLForRemounting else{
            continue
        }

        if remountURL.host == shareURL.host && remountURL.path == shareURL.path{
            return u
        }
    } 

    return nil
}

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 2011-11-24
    • 1970-01-01
    • 2020-02-19
    • 2010-10-02
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多