| 
 
| 功能: 
 /////我把这个程序说明说发到另外一篇博客////////////////////
 
 1、显示当前所在目录的路径名(指令pwd)
 
 2、列出指定目录名中的所有目录及文件(指令list)
 
 3、改变当前工作目录(指令chadir)
 
 4、新建目录(指令makedir)
 
 5、删除目录(指令deldir)
 
 6、退出命令解释程序(指令exit)
 
 7、重命名一个文件或目录(指令rename)
 
 8、复制一个已存在的文件(指令copy)
 
 9、在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径(指令find)
 
 10、输入指令错误时会提示,并可以重新输入
 
 
 
 下面的代码可以直接复制运行,笔者目前还未发现bug,每个功能封装在一个函数中,可以单个取出使用运行参考慢慢理解;
 
 1
 
 **用到的系统函数:**open(),close(),read(),write(),chdir(),opendir(),readdir(),closedir(),rmdir(),mkdir(),getcwd();
 
 
 
 代码如下(尾端有详细一点的代码解析,不懂可以评论或私聊):
 
 
 
 #include"stdio.h"
 
 #include"string.h"
 
 #include"unistd.h"
 
 #include"string.h"
 
 #include"sys/types.h"
 
 #include"sys/stat.h"
 
 #include"stdlib.h"
 
 #include"dirent.h"
 
 #include"stddef.h"
 
 #include"fcntl.h"
 
 ///////////////////////////////////////////////////////
 
 void pwd_();
 
 void makedir_();
 
 void deldir_();
 
 void exit_();
 
 void chadir_();
 
 void list_();
 
 void rename_();
 
 void copy_();
 
 void find_();
 
 void error_();
 
 ////////////////////////////////////////////////////
 
 #define buffsize 1024
 
 
 
 int main(void)
 
 {
 
 char command[30];
 
 while(1)
 
 {
 
 printf("Liangfenkai@");
 
 scanf("%s",command);
 
 fflush(stdin);
 
 if(strcmp(command,"pwd")==0)
 
 {
 
 pwd_();
 
 }
 
 else if(strcmp(command,"makedir")==0)
 
 {
 
 makedir_();
 
 }
 
 else if(strcmp(command,"deldir")==0)
 
 {
 
 deldir_();
 
 }
 
 else if(strcmp(command,"exit")==0)
 
 {
 
 exit_();
 
 }
 
 else if(strcmp(command,"chadir")==0)
 
 {
 
 chadir_();
 
 }
 
 else if((strcmp(command,"list")==0))
 
 {
 
 list_();
 
 }
 
 else if(strcmp(command,"rename")==0)
 
 {
 
 rename_();
 
 }
 
 else if(strcmp(command,"copy")==0)
 
 {
 
 copy_();
 
 }
 
 else if(strcmp(command,"find")==0)
 
 {
 
 find_();
 
 }
 
 else
 
 error_();
 
 }
 
 return 0;
 
 }
 
 
 
 //打印当前觉得路径//////////////////////////////////////////////////////////////////////////
 
 void pwd_()
 
 {
 
 char *path=NULL;
 
 path=getcwd(NULL,0);
 
 puts(path);
 
 free(path);
 
 }
 
 //创建文件夹/////////////////////////////////////////////////////////////////////////
 
 void makedir_()
 
 {
 
 char command1[30];
 
 scanf("%s",command1);
 
 fflush(stdin);
 
 if(mkdir(command1,0755)!=0)
 
 printf("make dir default!\n");
 
 }
 
 //删除文件夹////////////////////////////////////////////////////////////////////////
 
 void deldir_()
 
 {
 
 char command2[30];
 
 scanf("%s",command2);
 
 fflush(stdin);
 
 if(rmdir(command2)!=0)
 
 printf("delete dir default!\n");
 
 }
 
 //退出程序//////////////////////////////////////////////////////////////////////////
 
 void exit_()
 
 {
 
 exit(0);
 
 }
 
 //改变目录路径///////////////////////////////////////////////////////////////////////
 
 void chadir_()
 
 {
 
 char command3[50];
 
 scanf("%s",command3);
 
 fflush(stdin);
 
 if(chdir(command3)!=0)
 
 {
 
 printf("change dir path default!\n");
 
 }
 
 }
 
 //列出指定目录名中的所有目录及文件///////////////////////////////////////////////////////////////////////
 
 void list_()
 
 {
 
 char command4[50];
 
 struct dirent *entry;
 
 DIR *olist=NULL;
 
 int i=1;
 
 scanf("%s",command4);
 
 fflush(stdin);
 
 if((olist=opendir(command4))==NULL)
 
 {
 
 printf("opendir  default!\n");
 
 }
 
 while(entry=readdir(olist))
 
 {
 
 printf("file%d:%s\n",i,entry->d_name);
 
 i++;
 
 }
 
 i=1;
 
 if(closedir(olist)!=0)
 
 printf("closedir  default!\n");
 
 }
 
 //重命名一个文件或目录///////////////////////////////////////////////////////////
 
 void rename_()
 
 {
 
 char newname[30],oldname[30];
 
 printf("pleace input the old name:");
 
 scanf("%s",oldname);
 
 fflush(stdin);
 
 printf("pleace input the new name:");
 
 scanf("%s",newname);
 
 fflush(stdin);
 
 if(rename(oldname,newname)!=0)
 
 {
 
 printf("change name default!");
 
 }
 
 }
 
 //复制一个已存在的文件///////////////////////////////////////////////////////////////////////////
 
 void copy_()
 
 {
 
 char cp1[30],cp2[30],buf[buffsize];
 
 int fd1,fd2;
 
 int n;
 
 printf("pleace input the file be copy:\n");
 
 scanf("%s",cp1);
 
 fflush(stdin);
 
 printf("pleace input the new file name:\n");
 
 scanf("%s",cp2);
 
 if((fd1=open(cp1,O_RDWR|O_CREAT,0664))==-1)
 
 printf("open the file false!\n");
 
 if((n=read(fd1,buf,buffsize))==-1)
 
 printf("read the file false!\n");
 
 if((fd2=open(cp2,O_RDWR|O_CREAT,0664))==-1)
 
 printf("open the file false!\n");
 
 if(write(fd2,buf,n)==-1)
 
 printf("open the file false!\n");
 
 if(close(fd1)==-1)
 
 printf("close false!\n");
 
 if(close(fd2)==-1)
 
 printf("close false!\n");
 
 }
 
 //在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径///////////////
 
 void find_()
 
 {
 
 char *path1;
 
 char str1[30],str2[30];
 
 struct dirent *re;
 
 int j=0;
 
 DIR *dir;
 
 scanf("%s",str1);
 
 fflush(stdin);
 
 scanf("%s",str2);
 
 fflush(stdin);
 
 if((dir=opendir(str1))==NULL)
 
 printf("open dir error!\n");
 
 while((re=readdir(dir))!=NULL)
 
 {
 
 if(strcmp(re->d_name,str2)==0)
 
 {
 
 chdir(str1);
 
 path1=getcwd(NULL,0);
 
 puts(path1);
 
 chdir("..");
 
 j=1;
 
 }
 
 }
 
 if(j==0)
 
 {
 
 printf("no the file!\n");
 
 }
 
 }
 
 //输入指令错误时会提示,并可以重新输入//////////////////////////////////////////////////////////////////////
 
 void error_()
 
 {
 
 printf("input default!\n");
 
 }
 
 
 
 
 
 
 
 (1)strcmp()原型为:int strcmp(const char *str1, const char *str2)作用是:比较字符串str1与str2,若str1>str2则返回值大于0,str1==str2返回值等于0,str1<str2返回值小于0;
 
 
 
 (2)void pwd_()主要调用了getcwd()函数,其原型为char *getcwd(char *buf,size_t size),该函数会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buf的空间大小。成功返回指向buf的指针,失败返回-1;作用打印当前绝对路径。
 
 
 
 (3)void makedir_()主要调用int mkdir(const char *pathname,mode_t mode);*pathname是要创建目录名称(程序用char command1[30]),mode是目录权限,该程序用0755,意为拥有者可读可写可执行,而群组或其他人只能读跟执行,创建成功返回0,失败返回-1。作用创建新文件夹
 
 
 
 (4)void exit_()里直接调用函数exit(0),意为系统正常退出,要是exit(1)则为错误退出。作用退出程序
 
 
 
 (5)void deldir_()主要调用了int rmdir(const char *pathname);pathname为删除的目录(程序用char command2[30),可以是绝对路径及目录名,成功删除返回0,失败返回-1.作用删除目录
 
 
 
 (6)void chadir_()主要调用int chdir(const char * path);path是路径(程序用char command3[50];),成功返回0,失败返回-1,作用改变当前路径
 
 
 
 (7)void list_()主要调用DIR * opendir(const char * name),struct dirent * readdir(DIR * dir);int closedir(DIR *dir);其中name表示要打开的文件名(程序用char command4[50];),成功则返回DIR* 型态的目录流,打开失败则返回NULL(程序用DIR *olist=NULL;)。dir为DIR* 型态的目录流,程序中指向olist指向的地址,成功则返回下个目录进入点。有错误发生或读取到目录文件尾则返回NULL(程序用struct dirent *entry;)。而完成上述操作后就关闭参数olist所指的目录流(用closedir(olist)),关闭成功则返回0,失败返回-1;作用列出指定目录名中的所有目录及文件;
 
 
 
 (8)void rename_()主要调用int rename(char * oldname, char * newname);其中oldname是旧文件名,newname是新文件名(程序用char newname[30],oldname[30];),修改成功返回0,失败返回-1,作用修改文件名
 
 
 
 (9)void copy_()主要调用int open(const char *pathname,int flags,int perms),int close(int fd),ssize_t read(int fd, void *buf, size_t count),ssize_t write(int fd, void *buf, size_t count),其中pathname是要打开的文件名(程序用char cp1[30]),flags是文件权限(程序用O_RDWR|O_CREAT,意为读写方式打开文件,如果改文件不存在,就创建一个新的文件,并用第三个参数为其设置权限),则 perms也是设置权限的(程序中值是0664,意为八进制,拥有者,群组人员可读可写,其他人只能读),成功返回文件描述符,失败返回-1(程序用int fd1,fd2)。read()中fd也是文件描述符,把读到的字符存到buf中,count是读到的字节数,成功返回读到的字节数,失败返回-1(程序用int n)。write()中fd也是文件描述符,把数据来源为 buf,count是写入的字节数,成功返回写入的字节数,失败返回-1。close()中fd也是文件描述符,关闭成功返回0,失败返回-1.作用复制一个已存在的文件 (char cp1[30],cp2[30])。
 
 
 
 (10)void find_()主要调用了gets(),strcmp(),int chdir(const char *path ),char *getcwd(char *buf,size_t size),DIR * opendir(const char * name),struct dirent * readdir(DIR * dir);int closedir(DIR *dir);用到的变量char *path1;char str1[30],str2[30];struct dirent *re;int j=0;DIR *dir;该函数的实现是利用上述多个函数互相配合完成的,用opendir,readdir扫描目录及其子目录中查找指定的文件,用strcmp()比较与文件匹配是否一致,一致就用chdir()转入目录,再用getcwd()获取当前绝对路径,然后在利用chdir()返回原来的路径,若输入出错会有提示,用int j标志,当j==0时,就错误。作用在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径。
 
 
 
 (11)void error_()函数是输出命令错误时打印出input default!提示。作用提示输入错误
 
 ---------------------
 
 作者:_小页_
 
 来源:CSDN
 
 原文:https://blog.csdn.net/qq_41631679/article/details/84311338
 
 版权声明:本文为博主原创**,转载请附上博文链接!
 | 
 |