NSFileManager fileExistsAtPath:isDirectory and swift

Swift

Swift Problem Overview


I'm trying to understand how to use the function fileExistsAtPath:isDirectory: with Swift but I get completely lost.

This is my code example:

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

I can't understand how can I access the value for the b MutablePointer. What If I want to know if it set to YES or NO?

Swift Solutions


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

Solution 2 - Swift

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

Solution 3 - Swift

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

Solution 4 - Swift

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

Solution 5 - Swift

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)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMatterGoalView Question on Stackoverflow
Solution 1 - SwiftMartin RView Answer on Stackoverflow
Solution 2 - SwiftJonnyView Answer on Stackoverflow
Solution 3 - SwiftKarl NosworthyView Answer on Stackoverflow
Solution 4 - SwiftziligyView Answer on Stackoverflow
Solution 5 - SwiftJeehutView Answer on Stackoverflow