rename.c 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*!
  2. * \file lib/gis/rename.c
  3. *
  4. * \brief GIS Library - Rename file functions.
  5. *
  6. * (C) 2001-2015 by the GRASS Development Team
  7. *
  8. * This program is free software under the GNU General Public License
  9. * (>=v2). Read the file COPYING that comes with GRASS for details.
  10. *
  11. * \author Original author CERL
  12. */
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <unistd.h>
  17. #include <grass/gis.h>
  18. /*!
  19. \brief Rename a file or a directory in the filesystem.
  20. The file or directory <i>oldname</i> is renamed to <i>newname</i>.
  21. \param oldname current name
  22. \param newname new name
  23. \return 0 if successful
  24. \return -1 on error
  25. */
  26. int G_rename_file(const char *oldname, const char *newname)
  27. {
  28. int ret;
  29. #ifdef __MINGW32__
  30. remove(newname);
  31. #endif
  32. ret = rename(oldname, newname);
  33. if (ret == -1) {
  34. /* if fails, try to copy file and then remove */
  35. if (1 == G_copy_file(oldname, newname)) {
  36. if (remove(oldname) != -1)
  37. ret = 0;
  38. }
  39. }
  40. return ret;
  41. }
  42. /*!
  43. \brief Rename a database file.
  44. The file or directory <i>oldname</i> under the database <i>element</i>
  45. directory in the current mapset is renamed to <i>newname</i>.
  46. \bug This routine does not check to see if the <i>newname</i>
  47. name is a valid database file name.
  48. \param element element name
  49. \param oldname current name
  50. \param newname new name
  51. \return 0 if <i>oldname</i> does not exist
  52. \return 1 if successful
  53. \return -1 on error
  54. */
  55. int G_rename(const char *element, const char *oldname, const char *newname)
  56. {
  57. const char *mapset;
  58. char xname[GNAME_MAX], xmapset[GMAPSET_MAX];
  59. char from[GPATH_MAX], to[GPATH_MAX];
  60. /* name in mapset legal only if mapset is current mapset */
  61. mapset = G_mapset();
  62. if (G_name_is_fully_qualified(oldname, xname, xmapset)
  63. && strcmp(mapset, xmapset))
  64. return -1;
  65. if (G_name_is_fully_qualified(newname, xname, xmapset)
  66. && strcmp(mapset, xmapset))
  67. return -1;
  68. /* if file does not exist return 0 */
  69. if (access(G_file_name(from, element, oldname, mapset), 0) != 0)
  70. return 0;
  71. G_file_name(to, element, newname, mapset);
  72. /* return result of rename */
  73. return G_rename_file(from, to) == 0 ? 1 : -1;
  74. }