0
点赞
收藏
分享

微信扫一扫

嵌入式学习——Linux——目录练习

Yaphets_巍 2024-06-26 阅读 16

 1.cp dir1 dir2

实现目录与目录的copy

复制整个文件夹(包括其内容和子文件夹)通常不是一个简单的文件I/O操作,因为它需要递归地遍历源文件夹中的所有文件和子文件夹,

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <errno.h>

int do_cp_file(const char *src,const char *dest)
{
	int fd_s = open(src,O_RDONLY);
	int fd_d = open(dest,O_WRONLY|O_CREAT|O_TRUNC,0666);

	if (fd_s < 0 || fd_d < 0)
	{
		perror("open fail");
		return -1;
	}



	int ret = 0;
	char buf[100] = {0};

	while (ret = read(fd_s,buf,sizeof(buf)))
	{
		write(fd_d,buf,ret);
	}

	close(fd_s);
	close(fd_d);

	return 0;

}



//./a.out dir_s dir_d 
int do_cp_dir(const char *dir_s,const char *dir_d)
{
	if (mkdir(dir_d,0777) < 0 && errno!=EEXIST)
	{
		perror("mkdir fail");
		return -1;
	}

	DIR *dir = opendir(dir_s);
	if (dir == NULL)
	{
		perror("opendir fail");
		return -1;
	}

	while (1)
	{
		struct dirent *pdir = readdir(dir);

		char spath[512];
		char dpath[512];

		if (pdir == NULL)
			break;
		//dir_s 
		//dir_s/
		if (pdir->d_name[0] != '.')
		{
			dir_s[strlen(dir_s)-1]=='/'?sprintf(spath,"%s%s",dir_s,pdir->d_name):sprintf(spath,"%s/%s",dir_s,pdir->d_name); //"dir_s/1.txt" 
			dir_d[strlen(dir_d)-1]=='/'?sprintf(dpath,"%s%s",dir_d,pdir->d_name):sprintf(dpath,"%s/%s",dir_d,pdir->d_name); //"dir_s/1.txt" 
			if (pdir->d_type == DT_DIR)
			{
				do_cp_dir(spath,dpath);
			}else 
			{
				do_cp_file(spath,dpath);

			}
		}
	}

	closedir(dir);
	return 0;
}


// ./a.out dir1 dir2
int main(int argc, const char *argv[])
{
	if (argc != 3)
	{
		printf("usage: %s <src> <dest>\n",argv[0]);
		return -1;
	}

	do_cp_dir(argv[1],argv[2]);

	return 0;
}

 打开一个目录
统计该目录下的普通文件的个数

目录文件个数


普通
DT_REG
DT_DIR

#include <stdio.h>
#include <dirent.h>

int main(int argc, const char *argv[])
{
	if (argc != 2)
	{
		printf("usage: %s <dir1>\n",argv[0]);
		return -1;
	}

	DIR *dir = opendir(argv[1]);

	if (dir == NULL)
	{
		perror("opendir fail");
		return -1;
	}

	int cnt_r = 0;
    int cnt_d = 0;

	struct dirent *pdir = NULL;
	while (pdir = readdir(dir))
	{
		if (pdir->d_type == DT_DIR)
		{
			cnt_d++;
		}else if (pdir->d_type = DT_REG)
		{
			cnt_r++;
		}
	}

	printf("cnt_r = %d cnt_d = %d\n",cnt_r,cnt_d);

	closedir(dir);
	return 0;
}
举报

相关推荐

0 条评论