NSFileManager fileExistsAtPath:isDirectory and swift
The second parameter has the type UnsafeMutablePointer<ObjCBool>
, which means that
you have to pass the address of an ObjCBool
variable. Example:
var isDir : ObjCBool = false
if fileManager.fileExistsAtPath(fullPath, isDirectory:&isDir) {
if isDir {
// file exists and is a directory
} else {
// file exists and is not a directory
}
} else {
// file does not exist
}
Update for Swift 3 and Swift 4:
let fileManager = FileManager.default
var isDir : ObjCBool = false
if fileManager.fileExists(atPath: fullPath, isDirectory:&isDir) {
if isDir.boolValue {
// file exists and is a directory
} else {
// file exists and is not a directory
}
} else {
// file does not exist
}
Tried to improve the other answer to make it easier to use.
enum Filestatus {
case isFile
case isDir
case isNot
}
extension URL {
var filestatus: Filestatus {
get {
let filestatus: Filestatus
var isDir: ObjCBool = false
if FileManager.default.fileExists(atPath: self.path, isDirectory: &isDir) {
if isDir.boolValue {
// file exists and is a directory
filestatus = .isDir
}
else {
// file exists and is not a directory
filestatus = .isFile
}
}
else {
// file does not exist
filestatus = .isNot
}
return filestatus
}
}
}
Just to overload the bases. Here is mine that takes a URL
extension FileManager {
func directoryExists(atUrl url: URL) -> Bool {
var isDirectory: ObjCBool = false
let exists = self.fileExists(atPath: url.path, isDirectory:&isDirectory)
return exists && isDirectory.boolValue
}
}
I've just added a simple extension to FileManager to make this a bit neater. Might be helpful?
extension FileManager {
func directoryExists(_ atPath: String) -> Bool {
var isDirectory: ObjCBool = false
let exists = fileExists(atPath: atPath, isDirectory:&isDirectory)
return exists && isDirectory.boolValue
}
}