swdir.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /************************************************************************
  2. * AUTHOR: NiuJiuRu
  3. * FILENAME: swdir.c
  4. * CONTENT: 常用的目录操作接口函数
  5. * NOTE:
  6. * HISTORY:
  7. * 1, [2010-12-24] created by NiuJiuRu
  8. ************************************************************************/
  9. #include "swapi.h"
  10. #include "swstring.h"
  11. #include "swfile.h"
  12. #include "swdir.h"
  13. /* 创建目录以及该目录前的所有父目录 */
  14. int sw_dir_create(const char *dir)
  15. {
  16. char path1[MAX_PATH_CHARS] = { 0 }, path2[MAX_PATH_CHARS] = { 0 };
  17. char *ptr1 = NULL, *ptr2 = NULL;
  18. int cnt = 0;
  19. if(!dir) return -1;
  20. strncpy(path1, dir, sizeof(path1)-1);
  21. xstrcharreplace(path1, '\\', '/');
  22. ptr1 = path1;
  23. while(ptr1 < path1+strlen(path1))
  24. {
  25. memset(path2, 0, sizeof(path2));
  26. ptr2 = strchr(ptr1, '/');
  27. if(ptr2) { memcpy(path2, path1, ptr2-path1 > 0 ? ptr2-path1 : 1); ptr1 = ptr2 + 1; }
  28. else { strcpy(path2, path1); ptr1 = path1+strlen(path1); }
  29. if(sw_dir_exists(path2)) continue;
  30. if(mkdir(path2, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == 0) cnt++; // create a new directory success
  31. else break;
  32. }
  33. return cnt;
  34. }
  35. /* 删除目录以及该目录下的所有子目录和文件 */
  36. bool sw_dir_delete(const char *dir)
  37. {
  38. DIR *hDir = NULL; struct dirent *pData = NULL; struct stat statBuf = { 0 };
  39. char filename[MAX_PATH_CHARS] = { 0 }; // full path filename
  40. hDir = (DIR *)sw_dir_open(dir);
  41. if(!hDir) return false;
  42. while(1)
  43. {
  44. pData = (struct dirent *)sw_dir_read(hDir);
  45. if(!pData) break;
  46. if(xstrcasecmp(pData->d_name, ".") == 0 || xstrcasecmp(pData->d_name, "..") == 0) continue;
  47. memset(filename, 0, sizeof(filename));
  48. strncpy(filename, dir, sizeof(filename)-1);
  49. xstrcharreplace(filename, '\\', '/');
  50. if(filename[strlen(filename)-1] != '/') strcat(filename, "/");
  51. strcat(filename, pData->d_name);
  52. memset(&statBuf, 0, sizeof(statBuf));
  53. if(stat(filename, &statBuf) == 0)
  54. {
  55. if(S_ISDIR(statBuf.st_mode)) { if(!sw_dir_delete(filename)) return false; } // 目录
  56. else if(sw_file_delete(filename) != 0) return false; // 文件
  57. }
  58. }
  59. sw_dir_close(hDir);
  60. if(rmdir(dir) != 0) return false;
  61. return true;
  62. }
  63. /* 判断目录是否存在 */
  64. bool sw_dir_exists(const char *dir)
  65. {
  66. if(access(dir, 0) == 0) return true;
  67. else return false;
  68. }
  69. /* 打开目录 */
  70. void *sw_dir_open(const char *dir)
  71. {
  72. return opendir(dir);
  73. }
  74. /* 读目录内容, 返回NULL时表示结束 */
  75. void *sw_dir_read(void *hDir)
  76. {
  77. return readdir(hDir);
  78. }
  79. /* 关闭目录 */
  80. void sw_dir_close(void *hDir)
  81. {
  82. closedir(hDir);
  83. }
  84. /* 得到文件名 */
  85. char *xGetPathFileName(const char *path)
  86. {
  87. char *filename1 = NULL, *filename2 = NULL;
  88. filename1 = xstrcasechr(path, "right", '\\');
  89. filename2 = xstrcasechr(path, "right", '/');
  90. if(filename1 && filename2) return filename1 > filename2 ? filename1+1 : filename2+1;
  91. else if(filename1 && !filename2) return filename1+1;
  92. else if(!filename1 && filename2) return filename2+1;
  93. else return (char *)path;
  94. }
  95. /* 程序运行后, 得到其可执行文件所在的目录及对应文件名 */
  96. int xGetSelfRunningInfo(char *dir, char *bin)
  97. {
  98. char appModuleFile[MAX_PATH_CHARS] = { 0 };
  99. char *ptr = NULL;
  100. if(readlink("/proc/self/exe", appModuleFile, sizeof(appModuleFile)) < 0) return -1;
  101. ptr = xGetPathFileName(appModuleFile);
  102. if(dir) {
  103. memcpy(dir, appModuleFile, ptr-appModuleFile);
  104. dir[ptr-appModuleFile] = '\0';
  105. }
  106. if(bin) strcpy(bin, ptr);
  107. return 0;
  108. }