使用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)
}
答案 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)
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
}
}
}