FileNameUtils.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:3k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // 
  3. // FileNameUtils.h
  4. //
  5. // Kari Pulli
  6. // Fri Dec 18 11:09:49 CET 1998
  7. //
  8. //############################################################
  9. #ifndef _FILENAMEUTILS_H_
  10. #define _FILENAMEUTILS_H_
  11. #include <iostream.h>
  12. #include <string.h>
  13. #ifndef WIN32
  14. # include <unistd.h>
  15. #else
  16. # include <io.h>
  17. # include <direct.h>
  18. // supply some missing definitions
  19. # define S_ISDIR(mode)    ((mode&S_IFMT) == S_IFDIR)
  20. # ifndef F_OK
  21. # define R_OK    004     /* Test for Read permission */
  22. # define W_OK    002     /* Test for Write permission */
  23. # define X_OK    001     /* Test for eXecute permission */
  24. # define F_OK    000     /* Test for existence of File */
  25. # endif
  26. #endif
  27. #include <stdio.h>
  28. #include <sys/types.h>
  29. #include <sys/stat.h>
  30. inline bool
  31. get_filename_new_ending(const char* inName, const char* ext, 
  32. char* outName)
  33. {
  34.   if (inName == NULL || inName[0] == 0)
  35.     return false;
  36.   strcpy (outName, inName);
  37.   char* pExt = strrchr (outName, '.');
  38.   if (pExt == NULL)
  39.     pExt = outName + strlen (outName);
  40.   strcpy (pExt, ext);
  41.   return true;
  42. }
  43. inline bool
  44. filename_has_ending(const char* filename, const char *ending)
  45. {
  46.   int lenf = strlen (filename);
  47.   int lene = strlen (ending);
  48.   if (lenf <= lene)
  49.     return false;
  50.   return (0 == strcmp (filename+lenf-lene, ending)); 
  51. }
  52. inline void
  53. remove_trailing_slash(char *fname)
  54. {
  55.   int n = strlen(fname);
  56.   if (fname[n-1] == '/') fname[n-1] = 0;
  57. }
  58. inline bool
  59. check_file_access(const char *fname,
  60.   bool existence  = true,
  61.   bool readable   = true,
  62.   bool writable   = false,
  63.   bool executable = false,
  64.   bool directory  = false)
  65. {
  66.   int res = true;
  67.   // first test the access
  68.   int amode = 0;
  69.   if (existence ) amode |= F_OK;
  70.   if (readable  ) amode |= R_OK;
  71.   if (writable  ) amode |= W_OK;
  72.   if (executable) amode |= X_OK;
  73.   
  74.   if (access(fname, amode)) {
  75.     cerr << "You don't have the requested access mode "
  76.  << "for " << fname << endl;
  77.     perror(NULL);
  78.     res = false;
  79.   }
  80.   if (res && directory) {
  81.     struct stat st;
  82.     if (stat(fname, &st)) {
  83.       cerr << "Failed checking whether a directory for "
  84.    << fname << endl;
  85.       perror(NULL);
  86.       res = false;
  87.     }
  88.     if (!S_ISDIR(st.st_mode)) {
  89.       cerr << fname << " is not a directory" << endl;
  90.       res = false;
  91.     }
  92.   }
  93.   return res;
  94. }
  95. inline bool
  96. unlink_if_exists(const char *fname)
  97. {
  98.   if (access(fname, F_OK) == 0) {
  99.     // file exists
  100.     if (unlink(fname) != 0) {
  101.       perror(fname);
  102.       return false;
  103.     }
  104.   }
  105.   return true;
  106. }
  107. inline int
  108. portable_mkdir(const char* dname, int permissions = 00775)
  109. {
  110. #ifdef WIN32
  111. return mkdir (dname);
  112. #else
  113. return mkdir (dname, permissions);
  114. #endif
  115. }
  116. inline int
  117. portable_symlink(const char *s1, const char *s2)
  118. {
  119. #ifndef WIN32
  120.   return symlink(s1, s2);
  121. #else
  122.   cout << "portable_symlink not implemented on WIN32" << endl;
  123.   return 0;
  124. #endif
  125. }
  126. #endif