目录操作:
头文件:
#include <sys/types.h>
#include <dirent.h>
1.创建目录
int mkdir(const char *path, mode_t mode);
功能:根据路径创建目录
参数:path 目录路径,mode文件夹权限
返回:返回0 表示成功, 返回 -1表示错误,并且会设置errno值
注:在创建时设置权限需要使用umask(0);取消权限掩码限制,否则只能使用系统默认属性创建
2.打开目录
DIR * opendir(const char * name);
函数说明:opendir()用来打开参数name 指定的目录, 并返回DIR*形态的目录流, 和open()类似, 接下来对目录的读取和搜索都要使用此返回值.
返回值:成功则返回DIR* 型态的目录流, 打开失败则返回NULL.
DIR结构体
struct __dirstream { void *__fd; /* `struct hurd_fd' pointer for descriptor. */ char *__data; /* Directory block. */ int __entry_data; /* Entry number `__data' corresponds to. */ char *__ptr; /* Current pointer into the block. */ int __entry_ptr; /* Entry number `__ptr' corresponds to. */ size_t __allocation; /* Space allocated for the block. */ size_t __size; /* Total valid data in the block. */ __libc_lock_define (, __lock) /* Mutex lock for this structure. */ }; typedef struct __dirstream DIR;3.遍历目录
struct dirent * readdir(DIR * dir);
功能:从指定的drip目录指针中获取一次当前目录中的文件信息
参数: dir要读的目录指针
返回值:成功则返回struct dirent. 结构体指针 有错误发生或读取到目录文件尾则返回NULL
struct dirent { long d_ino; /* inode number 索引节点号 */ off_t d_off; /* offset to this dirent 在目录文件中的偏移 */ unsigned short d_reclen; /* length of this d_name 文件名长 */ unsigned char d_type; /* the type of d_name 文件类型 */ char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */ }d_type 定义
enum { DT_UNKNOWN = 0, # define DT_UNKNOWN DT_UNKNOWN //未知文件 DT_FIFO = 1, # define DT_FIFO DT_FIFO //FIFO有名管道文件 DT_CHR = 2, # define DT_CHR DT_CHR //字符设备文件 DT_DIR = 4, # define DT_DIR DT_DIR //目录文件 DT_BLK = 6, # define DT_BLK DT_BLK //块设备文件 DT_REG = 8, # define DT_REG DT_REG //普通文件 DT_LNK = 10, # define DT_LNK DT_LNK //链接文件 DT_SOCK = 12, # define DT_SOCK DT_SOCK //socket文件 DT_WHT = 14 # define DT_WHT DT_WHT //whiteout-base文件 };4.删除目录
int remove(char * filename);
功能:删除指定路径的文件或目录
参数:文件名或目录路径
filename为要删除的文件名,可以为一目录。如果参数filename 为一文件,则调用unlink()处理;若参数filename 为目录,则调用rmdir()来处理,且该目录必须为空。
返回值:成功则返回0,失败则返回-1,错误原因存于errno
int rmdir(const char *pathname);
使用rmdir()函数时,目录必须为空,否则调用失败,函数返回-1.成功时,函数返回0.
int unlink(const char *pathname);
在使用时由于删除目录比较麻烦需要遍历挨个删除,此处可以使用system("rm -rf /dir")
5.关闭目录
int closedir(DIR * dir);
功能:关闭之前打开的dir目录
返回值:关闭成功则返回0,,失败返回-1,,错误原因存于errno
#include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> int hsm_osm_save_object(HSM_OBJECT_PROPERTY* pObjectProperty, unsigned char* pObjectData, unsigned int nDataLength) { int ret; unsigned char name_buf[256]; FILE *pFile = NULL; DIR *pDIR = NULL; //mkdir umask(0); pDIR = opendir(PATH_ROOT); if(NULL == pDIR) { ret = mkdir(PATH_ROOT,0777); if(ret < 0) { LOGE("errno %d",errno); } } closedir(pDIR); pDIR = opendir(PATH_HSM); if(NULL == pDIR) { ret = mkdir(PATH_HSM,0777); if(ret < 0) { LOGE("errno %d",errno); } } closedir(pDIR); // MyMemset(name_buf,0,sizeof(name_buf)); if(pObjectProperty->nObjectType == HSM_OBJECT_TYPE_private_key) { pDIR = opendir(PATH_PRIV_CERT); if(NULL == pDIR) { ret = mkdir(PATH_PRIV_CERT,0777); if(ret < 0) { LOGE("errno %d",errno); } } closedir(pDIR); MyMemcpy(name_buf,PATH_PRIV_CERT,strlen(PATH_PRIV_CERT)); } else if(pObjectProperty->nObjectType == HSM_OBJECT_TYPE_public_key) { pDIR = opendir(PATH_PUB_CERT); if(NULL == pDIR) { ret = mkdir(PATH_PUB_CERT,0777); if(ret < 0) { LOGE("errno %d",errno); } } closedir(pDIR); MyMemcpy(name_buf,PATH_PUB_CERT,strlen(PATH_PUB_CERT)); } else if(pObjectProperty->nObjectType == HSM_OBJECT_TYPE_cert) { pDIR = opendir(PATH_ROOT_CERT); if(NULL == pDIR) { ret = mkdir(PATH_ROOT_CERT,0777); if(ret < 0) { LOGE("errno %d",errno); } } closedir(pDIR); MyMemcpy(name_buf,PATH_ROOT_CERT,strlen(PATH_ROOT_CERT)); } else { return -1; } //mkfile strcat(name_buf,pObjectProperty->strLabel); strcat(name_buf,".pem."); strcat(name_buf,pObjectProperty->strID); LOGD("%s",name_buf); pFile = fopen(name_buf,"w+"); if(NULL == pFile) { LOGE("fopen failed,errno = %#x",errno); return -1; } int fd = fileno(pFile ); fchmod(fd ,0777); ret = fwrite((void *)pObjectData,1,nDataLength,pFile); if(ret != nDataLength) { LOGE("fwrite failed,errno = %#x",errno); return -2; } fclose(pFile); return 0; } int hsm_delete_file(char * name) { int ret; unsigned char name_buf[128]; FILE *pFile = NULL; DIR *pDIR = NULL; struct dirent* pdirent; pDIR = opendir(name); if(NULL != pDIR) { while((pdirent = readdir(pDIR)) != NULL) { LOGD("d_name:%s,d_type:%d",pdirent->d_name,pdirent->d_type); memset(name_buf,0,sizeof(name_buf)); strcat(name_buf,name); strcat(name_buf,pdirent->d_name); if(pdirent->d_type == DT_REG) { LOGD("name_buf:%s",name_buf); ret = remove(name_buf); if(ret != 0) { LOGE("remove error %d",errno); } } } } closedir(pDIR); return 0; } int hsm_osm_delete_all() { int ret; ret = hsm_delete_file(PATH_PRIV_CERT); if(ret != 0) { LOGE("delete PRIV_CERT error %d",errno); } ret = hsm_delete_file(PATH_PUB_CERT); if(ret != 0) { LOGE("delete PUB_CERT error %d",errno); } ret = hsm_delete_file(PATH_ROOT_CERT); if(ret != 0) { LOGE("delete ROOT_CERT error %d",errno); } //system("rm priv_cert/*"); //system("rm pub_cert/*"); //system("rm root_cert/*"); return 0; }
