Как обрабатывать символические ссылки при чтении данных из пути к файлу в 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;
}

person masukomi    schedule 01.06.2016    source источник
comment
Я только что использовал ваш код для чтения содержимого текстового файла через символическую ссылку (созданную с помощью ln -s), и это сработало. Вы уверены, что это ваша проблема?   -  person Eric Aya    schedule 03.06.2016
comment
Кроме того, ваше приложение находится в песочнице?   -  person Eric Aya    schedule 03.06.2016
comment
Почему вы даже проверяете существование явно? Просто попробуйте прочитать содержимое и обработайте файл не найден соответствующим образом.   -  person Tali    schedule 03.06.2016
comment
@EricD он работает с символической ссылкой, которая указывает на ФАЙЛ, но не тогда, когда в пути над файлом есть каталог с символической ссылкой - я добавил поясняющее примечание   -  person masukomi    schedule 04.06.2016
comment
@EricD приложение не изолировано в песочнице - я проверяю наличие, потому что обработка исключений в качестве управления потоком является плохой практикой, а исключения, как правило, обходятся дорого, и потому что есть большая вероятность, что файла там не будет.   -  person masukomi    schedule 04.06.2016
comment
@EricD Я ошибся, что код не работает. среди других проблем мне удалось создать странную структуру символической ссылки, которая просто запутала файловую систему, так что ничего не читало ее. Спасибо за помощь.   -  person masukomi    schedule 04.06.2016
comment
Мой ответ вообще помог? Вы можете присудить награду и принять ответ, а затем закрыть вопрос, указав причину, по которой этот вопрос был вызван проблемой, которую больше нельзя воспроизвести, если хотите.   -  person JAL    schedule 06.06.2016
comment
не совсем. он просто говорит, как проверить, присутствует ли файл. Насколько я понимаю, вы все равно получите 50% награды, когда она истечет. Я просто не хочу отмечать это как принятый ответ, поскольку на самом деле это не так. Не уверен, что произойдет, если я закрою его до истечения срока его действия.   -  person masukomi    schedule 07.06.2016
comment
Я не уверен, что вы спрашиваете тогда. Путь всегда будет следовать за символической ссылкой, и мой код сообщит вам, относится ли символическая ссылка к каталогу или к файлу, и вы можете открыть файл/каталог по мере необходимости. Может я неправильно понял ваш вопрос? Также рад просто дождаться истечения срока действия вознаграждения, если это проблема, которую больше нельзя воспроизвести.   -  person JAL    schedule 07.06.2016


Ответы (1)


Если вы не уверены, ведет ли символическая ссылка к файлу или каталогу, вам следует использовать 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
person JAL    schedule 03.06.2016