目录和快捷

我试图理解如何使用函数 fileExistsAtPath:isDirectory:与斯威夫特,但我完全迷路了。

下面是我的代码示例:

var b:CMutablePointer<ObjCBool>?


if (fileManager.fileExistsAtPath(fullPath, isDirectory:b! )){
// how can I use the "b" variable?!
fileManager.createDirectoryAtURL(dirURL, withIntermediateDirectories: false, attributes: nil, error: nil)
}

我不能理解如何访问 b MutablePointer 的值。如果我想知道它是否设置为 YESNO

44616 次浏览

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
}
}
}

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
}
}

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 wrote this small FileManager extension which makes this call more Swifty:

extension FileManager {
/// Checks if a file or folder at the given URL exists and if it is a directory or a file.
/// - Parameter path: The path to check.
/// - Returns: A tuple with the first ``Bool`` representing if the path exists and the second ``Bool`` representing if the found is a directory (`true`) or not (`false`).
func fileExistsAndIsDirectory(atPath path: String) -> (Bool, Bool) {
var fileIsDirectory: ObjCBool = false
let fileExists = FileManager.default.fileExists(atPath: path, isDirectory: &fileIsDirectory)
return (fileExists, fileIsDirectory.boolValue)
}
}


Usage is like this:

let filePath = "/Users/Me/Desktop/SomeDirectory"
let (fileExists, fileIsDirectory) = FileManager.default.fileExistsAndIsDirectory(atPath: filePath)
// -> (true: something exists at this path, true: the thing is a directory)