| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- /************************************************************************
- * AUTHOR: NiuJiuRu
- * FILENAME: swdir.c
- * CONTENT: 常用的目录操作接口函数
- * NOTE:
- * HISTORY:
- * 1, [2010-12-24] created by NiuJiuRu
- ************************************************************************/
- #include "swapi.h"
- #include "swstring.h"
- #include "swfile.h"
- #include "swdir.h"
- /* 创建目录以及该目录前的所有父目录 */
- int sw_dir_create(const char *dir)
- {
- char path1[MAX_PATH_CHARS] = { 0 }, path2[MAX_PATH_CHARS] = { 0 };
- char *ptr1 = NULL, *ptr2 = NULL;
- int cnt = 0;
-
- if(!dir) return -1;
-
- strncpy(path1, dir, sizeof(path1)-1);
- xstrcharreplace(path1, '\\', '/');
- ptr1 = path1;
- while(ptr1 < path1+strlen(path1))
- {
- memset(path2, 0, sizeof(path2));
- ptr2 = strchr(ptr1, '/');
- if(ptr2) { memcpy(path2, path1, ptr2-path1 > 0 ? ptr2-path1 : 1); ptr1 = ptr2 + 1; }
- else { strcpy(path2, path1); ptr1 = path1+strlen(path1); }
-
- if(sw_dir_exists(path2)) continue;
- if(mkdir(path2, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) == 0) cnt++; // create a new directory success
- else break;
- }
-
- return cnt;
- }
- /* 删除目录以及该目录下的所有子目录和文件 */
- bool sw_dir_delete(const char *dir)
- {
- DIR *hDir = NULL; struct dirent *pData = NULL; struct stat statBuf = { 0 };
- char path[MAX_PATH_CHARS] = { 0 }; // full path(dir + entry name)
- bool success = true;
-
- hDir = (DIR *)sw_dir_open(dir);
- if(!hDir) return false;
- while(1)
- {
- pData = (struct dirent *)sw_dir_read(hDir);
- if(!pData) break;
-
- if(xstrcasecmp(pData->d_name, ".") == 0 || xstrcasecmp(pData->d_name, "..") == 0) continue;
-
- memset(path, 0, sizeof(path));
- strncpy(path, dir, sizeof(path)-1);
- xstrcharreplace(path, '\\', '/');
- if(strlen(path) > 0 && path[strlen(path)-1] != '/') strcat(path, "/");
- strcat(path, pData->d_name);
-
- memset(&statBuf, 0, sizeof(statBuf));
- if(lstat(path, &statBuf) == 0) // 用"lstat()"获取文件信息, 避免软链接等特殊文件导致的错误删除
- {
- if(S_ISDIR(statBuf.st_mode)) { if(!sw_dir_delete(path)) { success = false; break; } } // 目录
- else if(sw_file_delete(path) != 0) { success = false; break; } // 文件
- }
- }
- sw_dir_close(hDir);
-
- if(success && rmdir(dir) != 0) return false;
-
- return success;
- }
- /* 判断目录是否存在 */
- bool sw_dir_exists(const char *dir)
- {
- if(access(dir, 0) == 0) return true;
- else return false;
- }
- /* 打开目录 */
- void *sw_dir_open(const char *dir)
- {
- return opendir(dir);
- }
- /* 读目录内容, 返回NULL时表示结束 */
- void *sw_dir_read(void *hDir)
- {
- return readdir(hDir);
- }
- /* 关闭目录 */
- void sw_dir_close(void *hDir)
- {
- closedir(hDir);
- }
- /* 得到文件名 */
- char *xGetPathFileName(const char *path)
- {
- char *filename1 = NULL, *filename2 = NULL;
-
- filename1 = xstrcasechr(path, "right", '\\');
- filename2 = xstrcasechr(path, "right", '/');
-
- if(filename1 && filename2) return filename1 > filename2 ? filename1+1 : filename2+1;
- else if(filename1 && !filename2) return filename1+1;
- else if(!filename1 && filename2) return filename2+1;
- else return (char *)path;
- }
- /* 程序运行后, 得到其可执行文件所在的目录及对应文件名 */
- int xGetSelfRunningInfo(char *dir, char *bin)
- {
- char appModuleFile[MAX_PATH_CHARS] = { 0 };
- char *ptr = NULL;
-
- if(readlink("/proc/self/exe", appModuleFile, sizeof(appModuleFile)) < 0) return -1;
-
- ptr = xGetPathFileName(appModuleFile);
- if(dir) {
- memcpy(dir, appModuleFile, ptr-appModuleFile);
- dir[ptr-appModuleFile] = '\0';
- }
- if(bin) strcpy(bin, ptr);
-
- return 0;
- }
|