2017-02-03 7 views
1

Я пытаюсь реализовать touch команду из командной строки Unix, но мне кажется, что моя последняя строка бросает исключение: ** Exception: ~/.todo: openFile: does not exist (No such file or directory)Haskell Реализовать команду Unix «потрогать»

main = touch "~/.todo" 

touch :: FilePath -> IO() 
touch name = do 
    exists <- doesFileExist name 
    unless exists $ appendFile name "" 

Если есть какие-либо ОС конкретных поведение, я тестирую macOS Sierra.

Я чувствую, как будто эта ошибка странно, что документация openFile утверждает, что

Если файл не существует, и он открыт для вывода, он должен быть создан в виде нового файла.

Любые предложения относительно того, как исправить это?

Edit: Согласно @chi, команда touch всегда должен открыть файл, даже если он уже существует, потому что он будет обновлять дату последнего изменения файла.

touch :: FilePath -> IO() 
touch name = appendFile name "" 
+0

я успешно прикоснулся много файлов, используя этот код. возможно ли, что у вас странный cdd? – hao

+0

Кстати, 'touch' часто также используется для обновления метки времени существующего файла. – chi

+1

Исключение генерируется в 'openFile', но ваш фрагмент кода не включает это. Не могли бы вы его включить? – ocharles

ответ

1

В будущем, пожалуйста, вставьте весь код, который вы используете, что создает ошибку. Это включает как импорт, так и вызов. В вашем случае это, кажется, вы работаете что-то с характером расширения оболочки:

*Main> touch "~/foobar" 
*** Exception: ~/foobar: openFile: does not exist (No such file or directory) 

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

Вместо этого попробуйте правильный путь к файлу:

*Main> touch "/tmp/thisfile" 
*Main> 
Leaving GHCi. 
% ls -l /tmp/thisfile 
-rw-rw-r--. 1 theuser theuser 0 Feb 3 12:51 /tmp/thisfile 
+0

Вы правы в отношении моей ошибки. Я подозревал, что это была ошибка, но забыл перезапустить сеанс ghci. – Zylviij