【问题标题】:Get mounted volumes list with Swift?使用 Swift 获取已安装的卷列表?
【发布时间】:2015-10-21 15:43:16
【问题描述】:

有人知道如何获取所有使用 Swift 挂载的可移动卷的列表吗?

我已经尝试过了,但它会返回外部驱动程序的所有文件和子文件夹的列表:

let filemanager:NSFileManager = NSFileManager()
let files = filemanager.enumeratorAtPath("/Volumes")

while let file = files?.nextObject() {
    println(file)
    menu.addItem(NSMenuItem(title: file as! String, action: Selector(""), keyEquivalent: ""))
}

【问题讨论】:

    标签: macos swift cocoa mounted-volumes


    【解决方案1】:

    这将打印所有已安装卷的列表:

    let filemanager = NSFileManager()
    let keys = [NSURLVolumeNameKey, NSURLVolumeIsRemovableKey, NSURLVolumeIsEjectableKey]
    let paths = filemanager.mountedVolumeURLsIncludingResourceValuesForKeys(keys, options: nil)
    if let urls = paths as? [NSURL] {
        for url in urls {
            println(url)
        }
    }
    

    您当然可以过滤以仅获取“Volumes”目录中的路径:

    let filemanager = NSFileManager()
    let keys = [NSURLVolumeNameKey, NSURLVolumeIsRemovableKey, NSURLVolumeIsEjectableKey]
    let paths = filemanager.mountedVolumeURLsIncludingResourceValuesForKeys(keys, options: nil)
    if let urls = paths as? [NSURL] {
        for url in urls {
            if url.relativePath?.pathComponents.count > 1 {
                if url.relativePath?.pathComponents[1] == "Volumes" {
                    println(url)
                }
            }
        }
    }
    

    而 Swift 2 有两个不同之处:传递 [] 而不是 nil 作为文件管理器的选项,并且不需要转换 NSURL 数组:

    let filemanager = NSFileManager()
    let keys = [NSURLVolumeNameKey, NSURLVolumeIsRemovableKey, NSURLVolumeIsEjectableKey]
    let paths = filemanager.mountedVolumeURLsIncludingResourceValuesForKeys(keys, options: [])
    if let urls = paths {
        for url in urls {
            if url.relativePath?.pathComponents.count > 1 {
                if url.relativePath?.pathComponents[1] == "Volumes" {
                    print(url)
                }
            }
        }
    }
    

    Swift 2.1 更新

    let keys = [NSURLVolumeNameKey, NSURLVolumeIsRemovableKey, NSURLVolumeIsEjectableKey]
    let paths = NSFileManager().mountedVolumeURLsIncludingResourceValuesForKeys(keys, options: [])
    if let urls = paths {
        for url in urls {
            if let components = url.pathComponents
                where components.count > 1
                && components[1] == "Volumes" {
                    print(url)
            }
        }
    }
    

    Swift 3 更新

    let keys: [URLResourceKey] = [.volumeNameKey, .volumeIsRemovableKey, .volumeIsEjectableKey]
    let paths = FileManager().mountedVolumeURLs(includingResourceValuesForKeys: keys, options: [])
    if let urls = paths {
        for url in urls {
            let components = url.pathComponents
            if components.count > 1
               && components[1] == "Volumes"
            {
                print(url)
            }
        }
    }
    

    【讨论】:

    • 好的,完美,但是如何删除文本前面的'Optional("'?
    • 使用if let 解包值。你在哪里得到一个可选的?如有必要,我会更新我的答案。
    • 你能举个例子吗?我得到'可选(“NAME”)
    • 当然可以,但我需要知道你从哪里获得 Optional,因为我没有:当我运行此代码时,结果不是 Optional。您是否将url 作为我们打印的可选,还是其他?是 Swift 1 还是 Swift2?
    • 好的,没问题。很高兴我能帮上忙。
    【解决方案2】:

    在 Unix 系统上,系统文件编号为 2 的文件系统对象是挂载,无论是远程挂载(nfs、smb、afp)还是本地挂载。

    这是一个例子:

    let path = "/System/Volumes/Preboot"
    let systemAttributes = try FileManager.default.attributesOfItem(atPath: String(describing: path))
    if let fileSystemFileNumber = systemAttributes[.systemFileNumber] as? NSNumber {
        print("System File Number: \(fileSystemFileNumber)")
    }
    

    所以也许这可能是找到坐骑的捷径

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      • 2013-05-20
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      相关资源
      最近更新 更多