Haskell использует аргумент файла из командной строки с «..»

Использование анализатора командной строки дает строку, содержащую аргумент имени файла, в данном случае это «../somedir». Как преобразовать эту строку в типобезопасный Path Rel Dir из Путь, чтобы позже объединить с текущим каталогом?

relDir1 <- parseRelDir fp

выдает ошибку (как указано в описании , потому что он «содержит компонент пути .., представляющий родительский каталог»)

Попытка сначала объединить currentDir со строкой из командной строки, как в

relDir2 <- parseRelDir (currDir </> fp) 

возвращает ту же ошибку.

Я нашел «хак», используя collapse из FileSystem.Path, который требует decodeString и encodeString для преобразования из String (он же FilePath) в специальный FilePath используемый:

combPath = toFilePath currDir </> (locationDir $ flags) :: FilePath 
collPath = collapse . decodeString $ combPath   
absdir = makeAbsDir . encodeString $ collPath :: Path Abs Dir 

но предположим, что есть лучший подход к этой общей задаче?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Возможно, вы ищете canonicalizePath. Запуск ghci в /home/<my-user>:

System.Directory> canonicalizePath ".."
"/home"
Ответ принят как подходящий

Вы ссылаетесь на документацию пакета Path. Есть 6 упоминаний .., если вы выполните поиск на этой странице, и одно из них явно относится к вашему вопросу:

Иногда у вас есть пользовательский ввод, который содержит ../. Решение, которое мы выбрали with должна иметь функцию вроде resolveDir (найдена в пакете path-io):

resolveDir :: (MonadIO m, MonadThrow m)
           => Path Abs Dir -> FilePath -> m (Path Abs Dir) 

Который вызовет canonicalizePath, который сворачивает и нормализует путь, а затем разбираем обычным старым parseAbsDir и готовим газом. Этот и другие, подобные этому, могут быть добавлены в пакет пути.

Я не понял информацию в пакете Path. С добавленной информацией о canonicalizePath я увидел, что absdir <- resolveDir currDir (locationDir flags) дает желаемый результат!

user855443 03.04.2023 17:24

Другие вопросы по теме