2016-06-01 15 views
6

Ho un percorso file come stringa. Voglio:Come gestire i collegamenti simbolici durante la lettura dei dati da un percorso file in swift

  1. prova se c'è un file ci
  2. Leggere il contenuto del file come una stringa

il problema che sto avendo è che a volte che il percorso del file comporta un link simbolico (collegamento simbolico). Forse per il file stesso. Forse per una delle directory sopra il file.

[EDIT] chiudendo perché il seguente codice (che ho iniziato con), funziona davvero bene, c'erano solo più livelli di errore dell'utente coinvolti. Grazie per la gente di input.

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

Ho appena usato il codice per leggere il contenuto di un file di testo tramite un collegamento simbolico (creato con 'ln -s') e ha funzionato. Sei sicuro che questo sia il tuo problema? – Moritz

+0

Inoltre, la tua app è in modalità sandbox? – Moritz

+0

Perché verifichi esplicitamente l'esistenza? Basta provare a leggere il contenuto e gestire il file non trovato come appropriato. – Tali

risposta

3

Se non siete sicuri se il link simbolico porta ad un file o una directory, si dovrebbe utilizzare fileExistsAtPath(path:, isDirectory:). fileExistsAtPath restituirà sempre true per un collegamento simbolico, perché tecnicamente c'è un file in quel percorso. Passando un puntatore booleano per isDirectory, è possibile seguire il link simbolico a un file o una directory:

supponga symlinkToSomeFile è un collegamento simbolico a un file e symlinkToSomeDir è un link simbolico a una directory.

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 
Problemi correlati