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