Я хочу переименовать файл в Haskell без перезаписи уже существующего. Если целевой файл существует, я хочу иметь дело с этим в своем коде (добавив что-то к имени файла).Есть ли способ переименовать файлы в Haskell без перезаписывания существующих?
Описание renameFile
из System.Directory
говорит:
renameFile old new
изменяет имя существующего объекта файловой системы отold
кnew
. Если объектnew
уже существует, он атомарно заменяется объектомold
. Ни один из путей не может ссылаться на существующий каталог.
Есть ли какой-либо существующий модуль или команда, которая позволила бы мне переименовать без перезаписи?
Я знаю, что могу делать чеки самостоятельно. Я бы просто почувствовал больше лучше, если бы была функция, написанная кем-то испытанным. Записанные файлы ушли навсегда.
Update
Я хочу, чтобы переименовать фотографии, видео, живые фотографии от данных для создания либо из EXIF (по аналогии с jhead
) или файловой системы метка времени нормализуется к часовому поясу была сделана фотография. Это может быть что две фотографии были сделаны точно в одно и то же время и в конечном итоге получили бы то же имя: 2017-01-12 – 11-12-11.jpg
. Это не должно быть. Вторую фотографию следует называть чем-то вроде 2017-01-12 – 11-12-11a.jpg
.
Проблема с проверкой заключается в том, что между проверкой и фактическим переименованием какой-либо другой процесс мог создать целевой файл. Это классическое состояние гонки. Я не думаю, что это исправно. – melpomene
Как другие программы занимаются этим? 'jhead' переименовывает файлы изображений и добавляет буквы в имя файла, чтобы предотвратить перезапись существующих файлов. Или вы считаете, что у них одна и та же проблема, и просто подумайте, что маловероятно, что новый файл будет создан или другой будет переименован во время проверки и переименования? – Dominik
О, я тупой. Это можно сделать безопасно, используя 'link' /' unlink' вместо 'rename'. 'link (oldname, newname)' будет терпеть неудачу, если 'newname' уже существует. В Haskell это будут ['createLink' и' removeLink'] (http://hackage.haskell.org/package/unix-2.7.2.1/docs/System-Posix-Files.html#g:8) соответственно , – melpomene