NSFileManager fileExistsAtPath: isDirectory і swift


78

Я намагаюся зрозуміти, як використовувати функцію fileExistsAtPath:isDirectory:із Swift, але я повністю загублюсь.

Це мій приклад коду:

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

Я не можу зрозуміти, як я можу отримати доступ до значення для bMutablePointer. Що робити, якщо я хочу знати, встановлено значення YESчи NO?

Відповіді:


178

Другий параметр має тип UnsafeMutablePointer<ObjCBool>, який означає , що ви повинні передати адресу в якості ObjCBoolзмінної. Приклад:

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
}

Оновлення для Swift 3 та 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
}

1
Ось посилання на документ, developer.apple.com/documentation/foundation/filemanager/…
Метрополіс,

15
Це один із найдивніших інтерфейсів, які я коли-небудь бачив. Чому не може бути просто функція isDirectory (path :)?
святковий

12

Спробував вдосконалити іншу відповідь, щоб полегшити використання.

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

Я переписав цю відповідь як розширення URL-адреси.
Джонні,

6

Просто для перевантаження баз. Ось мій, який бере 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
    }
}

4

Я щойно додав просте розширення до FileManager, щоб зробити це трохи охайнішим. Може бути корисним?

extension FileManager {

    func directoryExists(_ atPath: String) -> Bool {
        var isDirectory: ObjCBool = false
        let exists = FileManager.default.fileExists(atPath: atPath, isDirectory:&isDirectory)
        return exists && isDirectory.boolValue
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.