检查NSURL是否是目录

时间:2014-06-13 15:16:22

标签: swift nsurl

使用Swift时我想检查NSURL位置是否是目录。使用Objective-C这不是问题和工作查找,但当我将代码转换为Swift时,我遇到运行时错误。

也许有人可以指出我正确的方向?

import Foundation

let defaultManager = NSFileManager.defaultManager()
let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
let localDocumentURLs = defaultManager.contentsOfDirectoryAtURL(documentsDirectory,
includingPropertiesForKeys: nil, options: .SkipsPackageDescendants, error: nil) as NSURL[]

for url in localDocumentURLs {
    var isError: NSError? = nil
    var isDirectory: AutoreleasingUnsafePointer<AnyObject?> = nil
    var success: Bool = url.getResourceValue(isDirectory, forKey: NSURLIsDirectoryKey, error: &isError)
}

8 个答案:

答案 0 :(得分:21)

在iOS 9.0+和macOS 10.11+中,NSURL / URL

中有一个属性

<强>夫特:

var hasDirectoryPath: Bool { get }

<强>目标-C:

@property(readonly) BOOL hasDirectoryPath;

答案 1 :(得分:14)

在我这方面做得很好:

var error: NSError?
let documentURL : NSURL = NSFileManager.defaultManager().URLForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomain: NSSearchPathDomainMask.UserDomainMask, appropriateForURL: nil, create: true, error: &error)
var isDirectory: ObjCBool = ObjCBool(0)
if NSFileManager.defaultManager().fileExistsAtPath(documentURL.path, isDirectory: &isDirectory) {
    println(isDirectory)
}

注意:它会检查 Documents 文件夹是否为文件夹。当然,你可以用任何东西替换URL。

答案 2 :(得分:9)

Swift 3

extension URL {
    var isDirectory: Bool {
        let values = try? resourceValues(forKeys: [.isDirectoryKey])
        return values?.isDirectory ?? false
    }
}

答案 3 :(得分:3)

这是原始海报代码的swift 2.0版本:

        do {
            var rsrc: AnyObject?
            try element.getResourceValue(&rsrc, forKey: NSURLIsDirectoryKey)
            if let isDirectory = rsrc as? NSNumber {
                if isDirectory == true {
                    // ...
                }
            }
        } catch {
        }

答案 4 :(得分:2)

我的2美分...... 迅捷的NSURL方式:(基于holex的回答)

var error: NSError?

// since getting it as URLForDirectory, it flags it as dir, for custom path: NSURL:fileURLWithPath:isDirectory:
let documentURL:NSURL = NSFileManager.defaultManager().URLForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomain: NSSearchPathDomainMask.UserDomainMask, appropriateForURL: nil, create: true, error: &error)

// passes true, if it exists and validates as dir (as flagged in the NSURL object)
if (documentURL.checkResourceIsReachableAndReturnError(&error) {
    println(error)
}

答案 5 :(得分:1)

这里有很多答案......但它们都有一个共同点:
他们都使用FileManager(实际上是NSFileManger)。

这种方法有一个缺点: FileManager不是线程安全的!并行使用来自不同线程的FileManager通常适用于无状态操作,但这无处可靠(当你依赖它时,你可能正在构建未定义的行为)。

一个安全的实现必须每次都创建一个新的FileManager实例,但这将是一个糟糕的性能,或者每个线程使用一个,这是巨大的管理开销。

我想在这里提出一个更好,更简单的方法,不需要任何第三方课程:

extension URL {
    var isDirectory: Bool? {
        do {
            let values = try self.resourceValues(
                forKeys:Set([URLResourceKey.isDirectoryKey])
            )
            return values.isDirectory
        } catch  { return nil }
    }
}

就是这样。使用resourceValues()方法,您还可以轻松查询其他有趣的信息,例如文件大小或上次修改日期。这是一个非常强大的API,在Obj-C中也存在NSURL的年龄。

答案 6 :(得分:0)

...这是FileManager上的Swift 3扩展程序:

extension FileManager {
    func isDirectory(url:URL) -> Bool? {
        var isDir: ObjCBool = ObjCBool(false)
        if fileExists(atPath: url.path, isDirectory: &isDir) {
            return isDir.boolValue
        } else {
            return nil
        }
    }
}

答案 7 :(得分:-1)

...和swift 3方法作为URL的扩展:

extension URL {
    func isDirectory() -> Bool? {
        var isDir: ObjCBool = ObjCBool(false)
        if FileManager.default.fileExists(atPath: self.path, isDirectory: &isDir) {
            return isDir.boolValue
        } else {
            return nil
        }
    }
}