Linux下C编程对目录的增删改查操作

目录操作:

头文件:

#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;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值