it-swarm.com.de

Wie prüfe ich, ob eine Datei im Verzeichnis "Documents" in Swift vorhanden ist?

Wie prüfe ich, ob eine Datei im Verzeichnis Dokumente in Swift vorhanden ist?

Ich verwende die [ .writeFilePath ]-Methode, um ein Bild im Verzeichnis Documents zu speichern, und ich möchte es jedes Mal laden, wenn die App gestartet wird. Ich habe jedoch ein Standardbild, wenn kein Bild gespeichert ist.

Aber ich kann mich einfach nicht damit beschäftigen, wie ich die Funktion [ func fileExistsAtPath(_:) ] benutze. Könnte jemand ein Beispiel für die Verwendung der Funktion mit einem übergebenen Pfadargument geben?.

Ich glaube, ich muss dort keinen Code einfügen, da dies eine generische Frage ist. Jede Hilfe wird sehr geschätzt.

Prost

102
GgnDpSingh

Swift 4.x Version

    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let url = NSURL(fileURLWithPath: path)
    if let pathComponent = url.appendingPathComponent("nameOfFileHere") {
        let filePath = pathComponent.path
        let fileManager = FileManager.default
        if fileManager.fileExists(atPath: filePath) {
            print("FILE AVAILABLE")
        } else {
            print("FILE NOT AVAILABLE")
        }
    } else {
        print("FILE PATH NOT AVAILABLE")
    }

Swift 3.x Version

    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let url = URL(fileURLWithPath: path)

    let filePath = url.appendingPathComponent("nameOfFileHere").path
    let fileManager = FileManager.default
    if fileManager.fileExists(atPath: filePath) {
        print("FILE AVAILABLE")
    } else {
        print("FILE NOT AVAILABLE")
    }

Swift 2.x -Version, muss URLByAppendingPathComponent verwenden

    let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
    let url = NSURL(fileURLWithPath: path)
    let filePath = url.URLByAppendingPathComponent("nameOfFileHere").path!
    let fileManager = NSFileManager.defaultManager()
    if fileManager.fileExistsAtPath(filePath) {
        print("FILE AVAILABLE")
    } else {
        print("FILE NOT AVAILABLE")
    }
185
mike.tihonchik

Überprüfen Sie den folgenden Code:

Swift 1.2

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String

let getImagePath = paths.stringByAppendingPathComponent("SavedFile.jpg")

let checkValidation = NSFileManager.defaultManager()

if (checkValidation.fileExistsAtPath(getImagePath))
{
    println("FILE AVAILABLE");
}
else
{
    println("FILE NOT AVAILABLE");
}

Swift 2.0

let paths = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])
let getImagePath = paths.URLByAppendingPathComponent("SavedFile.jpg")

let checkValidation = NSFileManager.defaultManager()

if (checkValidation.fileExistsAtPath("\(getImagePath)"))
{
    print("FILE AVAILABLE");
}
else
{
    print("FILE NOT AVAILABLE");
}
33
PREMKUMAR

Heutzutage (2016) empfiehlt Apple immer mehr, die URL-bezogene API von NSURL, NSFileManager usw. zu verwenden.

Um das Dokumentenverzeichnis in iOS und Swift 2 use zu erhalten

let documentDirectoryURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, 
                                 inDomain: .UserDomainMask, 
                        appropriateForURL: nil, 
                                   create: true)

Der try! ist in diesem Fall sicher, da dieses Standardverzeichnis garantiert vorhanden ist.

Hängen Sie dann die entsprechende Pfadkomponente für eine sqlite-Datei an

let databaseURL = documentDirectoryURL.URLByAppendingPathComponent("MyDataBase.sqlite")

Prüfen Sie nun, ob die Datei mit checkResourceIsReachableAndReturnError von NSURL vorhanden ist.

let fileExists = databaseURL.checkResourceIsReachableAndReturnError(nil)

Wenn Sie den Fehler benötigen, übergeben Sie den Zeiger NSError an den Parameter. 

var error : NSError?
let fileExists = databaseURL.checkResourceIsReachableAndReturnError(&error)
if !fileExists { print(error) }

Swift 3:

In Swift 3 ist checkResourceIsReachable markiert als kann werfen

do {
    let fileExists = try databaseURL.checkResourceIsReachable()
    // handle the boolean result
} catch let error as NSError {
    print(error)
}

Um nur den booleschen Rückgabewert zu berücksichtigen und den Fehler zu ignorieren, verwenden Sie den Nullkoaleszenzoperator

let fileExists = (try? databaseURL.checkResourceIsReachable()) ?? false
23
vadian

Es ist ziemlich benutzerfreundlich. Arbeiten Sie einfach mit dem defaultManager-Singleton von NSFileManager und verwenden Sie dann die fileExistsAtPath()-Methode, die einfach eine Zeichenfolge als Argument verwendet und einen Bool zurückgibt, sodass er direkt in die if-Anweisung eingefügt werden kann.

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let documentDirectory = paths[0] as! String
let myFilePath = documentDirectory.stringByAppendingPathComponent("nameOfMyFile")

let manager = NSFileManager.defaultManager()
if (manager.fileExistsAtPath(myFilePath)) {
    // it's here!!
}

Beachten Sie, dass der Downcast auf String in Swift 2 nicht erforderlich ist.

14
Mick MacCallum

Ein alternatives/empfohlenes Codemuster in Swift 3 wäre:

  1. Verwenden Sie URL anstelle von FileManager
  2. Verwendung der Ausnahmebehandlung

    func verifyIfSqliteDBExists(){
        let docsDir     : URL       = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        let dbPath      : URL       = docsDir.appendingPathComponent("database.sqlite")
    
        do{
            let sqliteExists : Bool = try dbPath.checkResourceIsReachable()
            print("An sqlite database exists at this path :: \(dbPath.path)")
    
        }catch{
            print("SQLite NOT Found at :: \(strDBPath)")
        }
    }
    

Zum Nutzen von Swift 3 Anfängern:

  1. Swift 3 hat den Großteil der NeXTSTEP-Syntax weggelassen
  2. Daher werden NSURL, NSFilemanager, NSSearchPathForDirectoriesInDomain nicht mehr verwendet
  3. Verwenden Sie stattdessen URL und FileManager 
  4. NSSearchPathForDirectoriesInDomain ist nicht erforderlich
  5. Verwenden Sie stattdessen FileManager.default.urls

Hier ein Codebeispiel, um zu überprüfen, ob eine Datei mit dem Namen "database.sqlite" im Anwendungsdokumentverzeichnis vorhanden ist:

func findIfSqliteDBExists(){

    let docsDir     : URL       = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
    let dbPath      : URL       = docsDir.appendingPathComponent("database.sqlite")
    let strDBPath   : String    = dbPath.path
    let fileManager : FileManager   = FileManager.default

    if fileManager.fileExists(atPath:strDBPath){
        print("An sqlite database exists at this path :: \(strDBPath)")
    }else{
        print("SQLite NOT Found at :: \(strDBPath)")
    }

}

Ganz einfach: Wenn es sich bei Ihrem Pfad um eine URL-Instanz handelt, konvertieren Sie sie mithilfe der Pfadmethode in eine Zeichenfolge.

    let fileManager = FileManager.default
    var isDir: ObjCBool = false
    if fileManager.fileExists(atPath: yourURLPath.path, isDirectory: &isDir) {
        if isDir.boolValue {
            //it's a Directory path
        }else{
            //it's a File path
        }
    }
2
Rohit Sisodia

Swift 4 Beispiel:

var filePath: String {
    //manager lets you examine contents of a files and folders in your app.
    let manager = FileManager.default

    //returns an array of urls from our documentDirectory and we take the first
    let url = manager.urls(for: .documentDirectory, in: .userDomainMask).first
    //print("this is the url path in the document directory \(String(describing: url))")

    //creates a new path component and creates a new file called "Data" where we store our data array
    return(url!.appendingPathComponent("Data").path)
}

Ich habe den Check in meine loadData-Funktion gestellt, die ich in viewDidLoad aufgerufen habe.

override func viewDidLoad() {
    super.viewDidLoad()

    loadData()
}

Dann habe ich unten loadData definiert.

func loadData() {
    let manager = FileManager.default

    if manager.fileExists(atPath: filePath) {
        print("The file exists!")

        //Do what you need with the file. 
        ourData = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as! Array<DataObject>         
    } else {
        print("The file DOES NOT exist! Mournful trumpets sound...")
    }
}
0
Joshua Dance

Das funktioniert gut für mich in Swift4:

func existingFile(fileName: String) -> Bool {

    let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String
    let url = NSURL(fileURLWithPath: path)
    if let pathComponent = url.appendingPathComponent("\(fileName)") {
        let filePath = pathComponent.path
        let fileManager = FileManager.default
        if fileManager.fileExists(atPath: filePath) 

       {

        return true

        } else {

        return false

        }

    } else {

        return false

        }


}

Sie können mit diesem Anruf überprüfen:

   if existingFile(fileName: "yourfilename") == true {

            // your code if file exists

           } else {

           // your code if file does not exist

           }

Ich hoffe es ist für jemanden nützlich. @; -]

0

Swift 4.2

extension URL    {
    func checkFileExist() -> Bool {
        let path = self.path
        if (FileManager.default.fileExists(atPath: path))   {
            print("FILE AVAILABLE")
            return true
        }else        {
            print("FILE NOT AVAILABLE")
            return false;
        }
    }
}

Verwenden: -

if fileUrl.checkFileExist()
   {
      // Do Something
   }
0
Lakhdeep Singh

Sie müssen vor dem Dateinamen einen Schrägstrich "/" hinzufügen, oder Sie erhalten einen Pfad wie ".../DocumentsFilename.jpg".

0
Jauzee