2016-06-01 3 views
6

Ich habe einen Dateipfad als Zeichenfolge. Ich möchte:So behandeln Sie Symlinks beim Lesen von Daten aus einem Dateipfad in swift

  1. -Test, ob es eine Datei gibt
  2. Lesen Sie den Inhalt der Datei als String

das Problem, das ich habe, ist, dass manchmal, dass Dateipfad einen symbolischen Link beinhaltet (Symlink). Vielleicht zur Datei selbst. Vielleicht zu einem der Verzeichnisse über der Datei.

[EDIT] Schließen Sie dies, weil der folgende Code (mit dem ich begonnen habe), funktioniert eigentlich gut, es gab nur mehrere Ebenen von Benutzerfehler beteiligt. Danke für die Eingabe Leute.

func getUserResource(relativeFilePath: String) -> String? { 
    let fileManager = NSFileManager.defaultManager() 

    let userFilePath = NSHomeDirectory() + relativeFilePath 

    if(fileManager.fileExistsAtPath(userFilePath)) 
    { 
     do { 
      return try String(contentsOfFile: userFilePath, encoding: NSUTF8StringEncoding); 
     } catch { 
      return nil; 
     } 
    } 
    return nil; 
} 
+0

Ich habe gerade Ihren Code verwendet, um den Inhalt einer Textdatei über einen Symlink (erstellt mit 'ln -s') zu lesen und es hat funktioniert. Sind Sie sicher, dass dies Ihr Problem ist? – Moritz

+0

Ist auch Ihre App Sandboxed? – Moritz

+0

Warum prüfen Sie sogar explizit nach dem Vorhandensein? Versuchen Sie einfach, den Inhalt einzulesen und Datei-nicht-gefunden wie geeignet zu behandeln. – Tali

Antwort

3

Wenn Sie nicht sicher sind, ob der Symlink auf eine Datei oder ein Verzeichnis führt, sollten Sie fileExistsAtPath(path:, isDirectory:) verwendet werden. fileExistsAtPath gibt immer true für einen Symlink zurück, da sich technisch eine Datei in diesem Pfad befindet. Durch die Übergabe eines boolschen Zeiger auf isDirectory, können Sie den symbolischen Link auf eine Datei oder ein Verzeichnis folgen:

Angenommen symlinkToSomeFile ist ein symbolischer Link zu einer Datei und symlinkToSomeDir ist ein symbolischer Link zu einem Verzeichnis.

let symlinkFilePath = NSHomeDirectory() + "/temp/symlinkToSomeFile" 
let symlinkDirPath = NSHomeDirectory() + "/temp/symlinkToSomeDir" 

var fileCheck: ObjCBool = false 
var dirCheck: ObjCBool = false 

print(fileManager.fileExistsAtPath(symlinkFilePath, isDirectory: &fileCheck)) // true 
print(fileCheck) // false 
print(fileManager.fileExistsAtPath(symlinkDirPath, isDirectory: &dirCheck)) // true 
print(dirCheck) // true 
Verwandte Themen