2016-06-01 8 views
6

У меня есть путь к файлу в виде строки. Я хочу:Как обращаться с символическими ссылками при чтении данных из пути файла в swift

  1. тест, если есть файл там
  2. Прочитайте содержимое файла в виде строки

проблема у меня есть, что иногда этот файл путь включает в себя символическую ссылку (символьная ссылка). Может быть, сам файл. Возможно, в одну из каталогов над файлом.

[EDIT] закрывает это, потому что следующий код (который я начал с), на самом деле работает нормально, были только несколько уровней ошибки пользователя. Спасибо за входных людей.

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

Я только что использовал ваш код, чтобы прочитать содержимое текстового файла через символическую ссылку (созданную с помощью 'ln -s'), и она сработала. Вы уверены, что это ваша проблема? – Moritz

+0

Кроме того, ваше приложение изолировано? – Moritz

+0

Почему вы даже явно проверяете существование? Просто попробуйте прочитать содержимое и обработать файл не найденным соответствующим образом. – Tali

ответ

3

Если вы не уверены, если символическая приводит к файлу или каталогу, вы должны использовать fileExistsAtPath(path:, isDirectory:). fileExistsAtPath всегда будет возвращать true для символической ссылки, потому что технически на этом пути есть файл. Пропустив булево указатель isDirectory, вы можете следить за символическую ссылку на файл или папку:

Предположим symlinkToSomeFile является символической ссылкой на файл и symlinkToSomeDir является символической ссылкой на каталог.

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 

 Смежные вопросы

  • Нет связанных вопросов^_^