练习二:在练习一的基础上,利用学到的目录IO的知识,修改练习一的代码,增加以下需求:
(1)打印我们需要拷贝的目录下的所有文件名,并拷贝我们需要的文件;
(2)通过键盘,输入我们要拷贝的文件的路径和文件名等信息
分析:
“打印需要拷贝的目录下的所有文件名”使用opendir以及closedir函数可以完成该操作;“拷贝我们需要的文件”这个属于练习一的内容。(练习一:将a.c的内容拷贝到b.c中)
“通过键盘,输入我们要拷贝的文件的路径和文件名等信息”可以使用c语言中的scanf函数来实现。
c代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
int main(int argc,char *argv[]) {
//步骤一:定义变量
int fd_src,fd_obj;
char buf[32] = { 0 };
char file_path[32] = { 0 };
char file_name[32] = { 0 };
ssize_t ret;
struct dirent* dir;
DIR* dp;
// 步骤二:从键盘输入文件路径,要通过键盘键入,可以使用“scanf”函数
printf("Please enter the file path:\n");
scanf("%s", file_path);
// 步骤三:打开目录,获得目录流指针,并读取目录
dp = opendir(file_path);
//用dp来接收opendir的返回值,该路径从哪里来呢?
//进行判断,如果目录流指针等于null,则打开目录失败;否则打印成功打开目录
if (dp == NULL)
{
printf("opendir is error\n");
return -1;
}
printf("opendir is ok\n");
while (1)
{
dir = readdir(dp);
if (dir != NULL)
{
printf("file name is %s\n", dir->d_name);
}
else
break;
}
// 步骤四:获得文件的名字
printf("Please enter the file name:\n");
scanf("%s", file_name);
// 步骤五:获得文件描述符
fd_src = open(strcat(strcat(file_path, "/"), file_name), O_RDWR);
if (fd_src < 0)
{
printf("open is error\n");
return -1;
}
fd_obj = open(file_name, O_CREAT | O_RDWR, 0666);
if (fd_obj < 0)
{
printf("open is error\n");
return -2;
}
// 步骤六:读写操作(使用循环,让它进行写操作)
while ((ret = read(fd_src, buf, 32)) != 0)
{
write(fd_obj, buf, ret);
}
// 步骤七:关闭目录,文件
close(fd_src);
close(fd_obj);
closedir(dp);
return 0;
}
在ubuntu界面的编译结果如下:
先查看practice里面有哪些文件,然后开始编译practice2.c文件