rename_file_if_exists.cpp 846 B

12345678910111213141516171819202122232425262728
  1. //
  2. // $Id$
  3. //
  4. #include<__vic/fs.h>
  5. #include<__vic/throw_errno.h>
  6. #include<__vic/posix/error.h>
  7. #include<unistd.h>
  8. #include<cerrno>
  9. //----------------------------------------------------------------------------
  10. bool __vic::rename_file_if_exists(const char *src_name, const char *dest_name)
  11. {
  12. // std::rename overwrites existing entry so we don't use it
  13. if(::link(src_name, dest_name) == 0)
  14. {
  15. if(::unlink(src_name) == 0 || posix::is_ENOENT(errno)) return true; // OK
  16. // Trying to remove newly created link
  17. int err = errno; // save errno
  18. ::unlink(dest_name);
  19. errno = err; // restore
  20. }
  21. else if(posix::is_ENOENT(errno)) // input file doesn't exist
  22. return false;
  23. throw_errno("__vic::rename_file");
  24. }
  25. //----------------------------------------------------------------------------