操作系统课程设计-Linux环境+Ubuntu+C语言
一.设计目的
熟悉Linux编程环境,加强对Linux命令的理解及函数的运用
二.设计内容
-
在Linux环境下模拟实现简单命令解释器。
(1)要求实现的基本命令包括:
pwd //显示当前所在目录的路径名
list <目录名> //列出指定目录名中的所有目录及文件
changedir <目录名或路径> //改变当前工作目录
makedir <目录名> //新建目录
deldir <目录名> //删除目录
exit //退出命令解释程序(2)可选做的扩展命令包括:
rename <旧文件名> <新文件名> //重命名一个文件或目录
copy <已存在的文件名> <副本文件名或路径> //复制一个已存在的文件
find <目录> -name <待查找的文件名> //在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径。(3)提示:整个程序的大致框架可参考如下:
while ( exit未被输入 )
{
接收键盘的一行输入
分析输入的命令
对输入的命令进行处理,调用系统函数实现功能
}
三. 设计要求
(1) 设计必须在Linux环境下进行。
(2) 命令解释程序的提示符为:姓名拼音@
(3) 程序编写中不得使用system()系统调用。
(4) 整个程序必须严格经过测试,完成所有基本功能。源程序应有较详尽的注释。
题目分析:
模拟了一个简单的命令解释器。主要实现了10个命令的功能。
1、 pwd:该命令是用于实现显示当前所在目录的路径名称,即当前的工作路径。
2、 list:该命令是用于实现列出指的目录名称中的所有目录名称及文件名称,该命令有两种用法,第一种是不带路径参数的,它的功能是列出当前工作路径下的所有目录名称和文件名称;第二种是带路径参数的,它的功能是可以列出指定某一路径下的所有目录名称和文件名称。
3、 changedir:该命令是用于改变当前工作的路径的,即改变当前工作目录。该命令必须带有路径参数,它会根据路径参数名去找到该路径。
4、 makedir:该命令是用于新建一个目录。该命令必须带有目录名称参数,它会根据目录名称去新建一个空目录。
5、 deldir:该命令是用于删除一个空目录。该命令必须带有目录名称参数,且该目录下不能包括二级目录和其它的文件。
6、 rename:该命令是用于为已存在的目录或文件重新命名,即重命名一个文件或目录。该命令必须带有两个参数,一个是旧的目录名或文件名,另一个是新的目录名或文件名,且新名称不能与旧名称相同。
7、 copy:该命令是用于复制一个已存在的文件。该命令必须带有两个参数,一个是已存在的文件名称,另一个是副本文件名,且新名称不能与旧名称相同。
8、 find:该命令是用于查找在指定的目录及子目录下中查找指定的文件,并输出查找到的文件的绝对路径。该命令必须带有两个参数,一个是指定的目录路径,另一个是待查找的文件名。
9、 help:该命令是用于直接输出系统包括哪些命令及其用法,即当用户输入命令有误时,可以输入该命令获取帮助。
10、exit:该命令是用于退出命令解释程序的,即退出系统的使用。
需要使用到的基本函数:
1、getcwd(char buffer,size_t size):该函数会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buf的空间大小。
2、opendir(const char * name):用来打开参数name 指定的目录, 并返回DIR形态的目录流, 和open()类似, 接下来对目录的读取和搜索都要使用此返回值。返回值:成功则返回DIR* 型态的目录流, 打开失败则返回NULL。
3、chdir (const char * path):用户将当前的工作目录改变成以参数路径所指的目录。返回值执行成功则返回0,失败返回-1,errno为错误代码。
4、mkdir(const char *pathname, mode_t mode):mkdir()函数以mode方式创建一个以pathname为名字的目录,mode定义所创建目录的权限,返回值: 0:目录创建成功 -1:创建失败,mkdir只能一次创建一层目录。
5、rmdir(dir,context):rmdir() 函数删除空的目录。dir必需的,规定要删除的目录。context可选的,规定文件句柄的环境。context 是一套可以修改流的行为的选项。返回值:如果成功,该函数返回 TRUE。如果失败,则返回 FALSE。
6、rename(char * oldname,char * newname):函数rename()用于重命名文件、改变文件路径或更改目录名称。参数oldname为旧文件名,newname为新文件名。返回值:修改文件名成功则返回0,否则返回-1。
7、open(const char * pathname, int flags)或open(const char * pathname, int flags, mode_t mode):参数 pathname 指向欲打开的文件路径字符串。下列是参数flags 所能使用的旗标:O_RDONLY 以只读方式打开文件;O_WRONLY 以只写方式打开文件;O_RDWR 以可读写方式打开文件。上述三种旗标是互斥的,也就是不可同时使用,但可与下列的旗标利用OR(|)运算符组合。O_CREAT 若欲打开的文件不存在则自动建立该文件。O_EXCL 如果O_CREAT 也被设置, 此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误.。此外,若O_CREAT 与O_EXCL 同时设置,并且欲打开的文件为符号连接,则会打开文件失败。
8、write (int fd, const void * buf, size_t count):write()会把参数buf 所指的内存写入count 个字节到参数fd 所指的文件内。当然,文件读写位置也会随之移动。返回值:如果顺利write()会返回实际写入的字节数。当有错误发生时则返回-1,错误代码存入errno 中。
9、ftw(const char *dir, int (*fn) (const file, const struct stat sb, int flag), int depth):ftw() 会从参数dir指定的 目录开始,往下一层层地递归式遍历子 目录。ftw()会传三个参数给fn(), 第一个参数file指向当时所在的 目录路径,第二个参数是sb, 为stat结构指针,第三个参数为旗标,有下面几种可能值:FTW_F 一般文件;FTW_D 目录;FTW_DNR 不可读取的 目录,此 目录以下将不被遍历;FTW_SL 符号连接;FTW_NS 无法取得stat结构数据,有可能是 权限问题。最后一个参数depth代表ftw()在进行遍历 目录时同时打开的文件数。ftw()在遍历时每一层 目录至少需要一个文件描述词,如果遍历时用完了depth所给予的限制数目,整个遍历将因不断地关文件和开文件操作而显得缓慢。如果要结束ftw()的遍历,fn()只需返回一非零值即可,此值同时也会是ftw()的返回值。否则ftw()会试着走完所有的 目录,然后返回0。返回值:遍历中断则返回fn()函数的返回值,全部遍历则返回0,若有错误发生则返回-1。
编写代码:
pwd:显示当前工作路径功能:该功能实现显示当前所在目录的名称,只需要输入命令即可将当前工作路径输出。
//显示当前所在目录的路径名
void myPath()
{
char *path = NULL;
path = getcwd(NULL,0); //复制当前工作目录的绝对路径
puts(path);
free(path);
}
list:列出指定目录中的所有目录及文件功能:该功能实现输出指定目录下的所有目录名称和文件名称。该功能有两种用法,第一种是直接输入命令,即可将当前路径下的所有目录名称和文件名称输出。第二种是带参数的,提定输出的目录路径,将该路径下的所有目录名称和文件名称输出。如果指定的路径不存在,则会输出错误提示。
没有带有参数的函数
//输出当前目录下的所有目录及文件
void openFile()
{
DIR *dirptr=NULL; //定义目录操作数据流
struct dirent *entry;
if((dirptr = opendir("."))==NULL) //通过一个目录路径返回一个对该目录数据流操作的DIR
{
printf("打开文件失败!");
}
else
{
while((entry=readdir(dirptr)) != NULL) //返回当前DIR中的目录或者文件实体
{
if(strcmp(entry->d_name,".")==0 || strcmp(entry->d_name,"..")==0) //用于清除 .和.. 的路径名
{
continue;
}
printf("%s\t",entry->d_name);
}
closedir(dirptr);
}
}
带有参数的函数
//列出指定目录名中的所有目录及文件
void openFiles(char pathName[])
{
DIR *dirptr=NULL; //定义目录操作数据流
struct dirent *entry;
if((dirptr = opendir(pathName))==NULL) //通过一个目录路径返回一个对该目录数据流操作的DIR
{
printf("打开文件失败!");
}
else
{
while((entry=readdir(dirptr)) != NULL) //返回当前DIR中的目录或者文件实体
{
if(strcmp(entry->d_name,".")==0 || strcmp(entry->d_name,"..")==0) //用于清除 .和.. 的路径名
{
continue;
}
printf("%s\t",entry->d_name);
}
closedir(dirptr);
}
}
changedir:改变当前工作目录功能:该功能实现可以改变当前工作的路径。该功能必须带有参数,即要改变的目录名称或路径名称,它会判断该目录或路径是否存在,若存在,则改变当前的工作路径;若不存在,则会输出错误提示。
//改变当前工作目录
void changePath(char pathName[])
{
if(chdir(pathName)==0)
{
printf("当前工作目录为: %s \n", getcwd(NULL, 0));
}
else
{
printf("%s路径不存在!\n",pathName);
}
}
makedir:新建目录功能:该功能实现新建一个空目录。该功能必须带有新目录名称的参数且只能带有一个参数,即只能一次新建一个空目录,它会判断新建的目录名称是否与当前已存在的目录名称相同,若相同,则创建失败,会输出错误提示;若不同,则新建空目录成功。
//新建目录
void newFile(char fileName[])
{
if(mkdir(fileName,S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH) == 0)
{
printf("%s 创建成功!\n",fileName);
}
else
{
printf("mkdir:无法创建目录\"%s\"文件已存在!\n",fileName);
}
}
deldir删除目录功能:该功能实现删除一个空目录,不能删除任务文件。该功能必须带有想要删除的目录名称参数且只能带有一个参数,即只能一次删除一个空目录,它会判断删除的目录名称是否存在,若不存在,则删除失败,会输出错误提示;若存在,则删除空目录成功。
//删除目录
void deleteFile(char fileName[])
{
if(rmdir(fileName) == 0)
{
printf("%s 删除成功!\n",fileName);
}
else
{
printf("rmdir:未能删除\"%s\":没有此类文件或目录不为空!\n",fileName);
}
}
rename:重命名文件或目录功能:该功能实现为已存在的目录或文件重新命令。该功能必须带有两个参数,一个是旧的目录名称或文件名称,另一个是新的目录名称或文件名称,且新名称不能与旧名称相同。它会判断重命名的目录或文件是否存在,若不存在,则修改失败,会输出错误提示;若存在,则修改成功。
//重命名一个文件或目录
void changeFileName(char oldName[],char newName[])
{
if(rename(oldName,newName)==0)
{
printf("%s修改成功!\n",newName);
}
else
{
printf("%s该目录或文件不存在!",oldName);
}
}
copy:复制已存在的文件功能:该功能实现复制一个已存在的文件,且副本文件只能复制在当前路径下。该功能必须带有两个参数,一个是已存在的文件名称,另一个是副本的文件名称,且副本文件名称不能与旧文件名称相同和不能与当前路径下已存在的其它文件名称相同。它会判断要复制的文件是否存在和副本文件名称是否与其它文件名称相同,若复制的文件存在且副本文件与其它文件名称不同,则复制成功,否则复制失败,会输出错误提示。
//复制一个已存在的文件
int copyFile(char oldName[],char newName[])
{
const char *pathName = newName;
int in, out,flag;
char buf[1024];
int sign = 0;
in=open(oldName,O_RDONLY,S_IRUSR|S_IWUSR); //以只读的方式打开文件
if(in<0)
{
printf("%s打开文件失败!%s创建文件失败!\n",oldName,newName);
return sign;
}
out=open(pathName,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR); //以读写的方式打开或创建一个文件
if(out<0)
{
printf("%s创建文件失败!\n",newName);
return sign;
}
while((flag=read(in,buf,1024))>0) //循环读写文件
{
write(out,buf,flag);
sign = 1;
}
close(in); //关闭文件
close(out); //关闭文件
return sign;
}
find:查找指定文件功能:该功能实现在指定的目录路径及子目录下查找指定的文件,并输出查找到的指定文件的绝对路径。该功能必须带有两个参数,一个是指定目录路径名称,另一个是待查找的文件名称。它会判断指定的目录路径是否存在,若存在,则会在该目录及其子目录下查找指定的文件名称,每查找到一个,则会输出该文件的绝对路径名称,且它会将在该目录及其子目录下的所有查找的文件的绝对路径名称输出。若指定目录及其子目录下不存在指定的文件,则会输出提示。
// 输出查找到的文件的绝对路径。
int findName(const char *file , const struct stat *sb ,int flag)
{
if(flag == FTW_F) //读取一般文件
{
char * p;
char filePath[100]; //定义用于存放要查找的文件路径
char fileNames[20]; //定义用于存放要查找的文件名
strcpy(filePath,file); //复制要查找的文件路径
p = strtok(filePath,"/"); //用 / 分割文件路径,用于找到文件名
while(p)
{
strcpy(fileNames,p); //复制最后一个文件名
p = strtok(NULL,"/");
}
if(strcmp(findFileName,fileNames)==0) //判断文件名是否与要查找的文件名相同
{
printf("\n绝对路径为:%s\n",file);
fileFlag++; //标记找到查找文件的绝对路径
}
}
return 0;
}
//在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径。
void findFile(char filePath[])
{
DIR *sp;
if((sp = opendir(filePath)) == 0) //打开文件夹,不存在返回0
{
printf("\"%s\"打开文件路径失败!",filePath);
return ;
}
else
{
ftw(filePath,findName,500); //递归式遍历子目录
}
if(fileFlag==0) //判断是否找到文件的绝对路径
{
printf("该\"%s\"目录及其子目录下的\"%s\"文件不存在!",filePath,findFileName);
}
closedir(sp);
}
help:输出系统帮助功能:该功能实现输出系统的帮助信息,主要是在操作过程中,因操作不当而出现错误时,系统会提示可以输入help获取更多的帮助,若输入help,则会将系统支持的命令功能及用法输出,帮助用户可以更好地操作系统。
//输出系统帮助函数
void helpMessage()
{
printf("------------------------------------------------------------------------------------------------------------------------------------------------------\n");
printf("-----------------------------支持命令有:pwd list changedir makedir deldir rename copy find help exit----------------------------------------\n");
printf("---------------------------------pwd :显示当前所在目录的路径名-------------------------------------------------\n");
printf("---------------------------------list <目录名> :列出指定目录名中的所有目录及文件-----------------------------------------\n");
printf("---------------------------------changedir <目录名或路径> :改变当前工作目录---------------------------------------------------------\n");
printf("---------------------------------makedir <目录名> :新建目录-----------------------------------------------------------------\n");
printf("---------------------------------deldir <目录名> :删除目录-----------------------------------------------------------------\n");
printf("---------------------------------rename <旧文件名> <新文件名> :重命名一个文件或目录-----------------------------------------------------\n");
printf("---------------------------------copy <已存在的文件名> <副本文件名或路径> :复制一个已存在的文件-----------------------------------------------------\n");
printf("---------------------------------find <目录> -name <待查找的文件名> :在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径。---\n");
printf("---------------------------------help :输出系统帮助命令---------------------------------------------------------\n");
printf("---------------------------------exit :退出命令解释程序---------------------------------------------------------\n");
printf("------------------------------------------------------------------------------------------------------------------------------------------------------\n\n");
}
本系统可以实现的功能有,显示当前所在目录的路径名;列出指定目录名中所有目录及文件;改变当前工作目录;新建目录;删除目录;重命名一个文件或目录;复制一个已存在的文件;查找指定文件在指定目录及子目录下的绝对路径;输出系统帮助信息;退出命令解释程序。
完整代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <ftw.h>
#define CLOSE printf("\033[0m"); //关闭彩色字体
#define GREEN printf("\033[36m"); //绿色字体
char findFileName[50]={""}; //用于存放要查找的文件名
int fileFlag = 0; //用于标记是否找到查找的文件名
void getOrders(char allOrders[],char order1[],char order2[],char order3[]); //命令分割函数
void myPath(); //显示当前所在目录的路径名
void openFile(); //列出当前目录下的所有目录及文件
void openFiles(char pathName[]); //列出指定目录名中的所有目录及文件
void changePath(char pathName[]); //改变当前工作目录
void newFile(char fileName[]); //新建目录
void deleteFile(char fileName[]); //删除目录
void changeFileName(char oldName[],char newName[]); //重命名一个文件或目录
int copyFile(char oldName[],char newName[]); //复制一个已存在的文件
void findFile(char filePath[]); //在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径
int findName(const char *file , const struct stat *sb ,int flag); //输出查找到的文件的绝对路径
void systemMessage(); //输出系统信息
void helpMessage(); //输出系统帮助函数
int main()
{
systemMessage(); //输出系统信息
char allOrders[100]; //定义用于存放所有的操作命令
char newAllOrders[100]; //复制操作命令,用于操作错误输出,即记录错误的指令
while(1)
{
char order1[20]={""}; //定义存放操作命令
char order2[20]={""}; //定义存放操作指令
char order3[20]={""}; //定义存放操作指令
GREEN; //改变输出文字的颜色
printf("\n*******@ ");
CLOSE; //关闭输出文字的颜色
scanf("%[^\n]",allOrders); //输入所有的操作命令 ,[^\n] 用于输入包含空格的字符串,以回车结尾
getchar(); //用于清除回车符
strcpy(newAllOrders,allOrders); //复制操作命令,用于操作错误输出,即记录错误的指令
getOrders(allOrders,order1,order2,order3); //分割操作命令,提取各个操作指令
if(strcmp(order1,"pwd") == 0 && strcmp(order2,"") == 0 && strcmp(order3,"") == 0) //判断操作命令是否为pwd
{
myPath(); //显示当前所在目录的路径名
}
else if(strcmp(order1,"list") == 0) //判断操作命令是否为list
{
if(!(strcmp(order2,"") == 0))
{
openFiles(order2); //输出指定目录名中的所有目录及文件
}
else
{
openFile(); //输出当前目录下的所有目录及文件
}
}
else if(strcmp(order1,"changedir") == 0) //判断操作命令是否为changedir
{
if(!(strcmp(order2,"") == 0)) //判断操作指令是否为空
{
changePath(order2); //改变当前工作目录
}
else
{
printf("%s:缺少操作数!请重新输入!\n想了解内部命令的用法,请输入help,获取更多帮助!\n",order1);
}
}
else if(strcmp(order1,"makedir")==0) //判断操作命令是否为makedir
{
if(!(strcmp(order2,"") == 0)) //判断操作指令是否为空
{
newFile(order2); //新建目录
}
else
{
printf("%s:缺少操作数!请重新输入!\n想了解内部命令的用法,请输入help,获取更多帮助!\n",order1);
}
}
else if(strcmp(order1,"deldir")==0) //判断操作命令是否为deldir
{
if(!(strcmp(order2,"") == 0)) //判断操作指令是否为空
{
deleteFile(order2); //删除目录
}
else
{
printf("%s:缺少操作数!请重新输入!\n想了解内部命令的用法,请输入help,获取更多帮助!\n",order1);
}
}
else if(strcmp(order1,"rename")==0) //判断操作命令是否为rename
{
if(strcmp(order2,"") == 0 || strcmp(order3,"") == 0) //判断操作指令是否为空
{
printf("%s:缺少操作数!请重新输入!\n想了解内部命令的用法,请输入help,获取更多帮助!\n",order1);
}
else if(strcmp(order2,order3)==0) //判断输入的文件名是否相同
{
printf("新文件名不能与旧文件名同名!");
}
else
{
changeFileName(order2,order3); //重命名一个文件或目录
}
}
else if(strcmp(order1,"copy")==0) //判断操作命令是否为copy
{
if(strcmp(order2,"") == 0 || strcmp(order3,"") == 0) //判断操作指令是否为空
{
printf("%s:缺少操作数!请重新输入!\n想了解内部命令的用法,请输入help,获取更多帮助!\n",order1);
}
else if(strcmp(order2,order3)==0) //判断输入的文件名是否相同
{
printf("复制的新文件名不能与旧文件名同名!");
}
else
{
if(copyFile(order2,order3) == 1) //复制一个已存在的文件
{
printf("%s文件复制成功!\n",order3);
}
}
}
else if(strcmp(order1,"find")==0) //判断操作命令是否为find
{
if(strcmp(order2,"") == 0 || strcmp(order3,"") == 0) //判断操作指令是否为空
{
printf("%s:缺少操作数!\n请重新输入!想了解内部命令的用法,请输入help,获取更多帮助!\n",order1);
}
else
{
strcpy(findFileName,order3); //复制要查找的文件名
fileFlag = 0; //将文件标记重新赋值为0,用于判断是否找到文件路径
findFile(order2); //在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径。
}
}
else if(strcmp(order1,"help")==0)
{
helpMessage(); //输出系统帮助信息
}
else if(strcmp(order1,"exit")==0) //判断操作命令是否为exit
{
printf("\n退出命令解释程序!\n");
exit(0); //结束程序
}
else //操作命令错误,输出提示
{
printf("\n%s\n不是内部或外部命令,\n想了解内部命令的用法,请输入help,获取更多帮助!\n",newAllOrders);
}
}
return 0;
}
//命令分割函数
void getOrders(char allOrders[],char order1[],char order2[],char order3[])
{
char * p;
int flag=0; //标记,用于标记分割的操作指令 0代表分割一个操作指令 1代表分割两个操作指令 2代表分割三个操作指令
p = strtok(allOrders," "); //用空格分割操作命令
while(p)
{
if(flag==0)
{
strcpy(order1,p); //将分割的第一个操作指令,赋值给order1
flag=1; //将标记赋值为1,如果有下一个指令,则进行下一次分割
}
else if(flag==1)
{
strcpy(order2,p); //将分割的第二个操作指令,赋值给order2
flag=2; //将标记赋值为2,如果有下一个指令,则进行下一次分割
}
else if(flag==2)
{
strcpy(order3,p); //将分割的最后一个操作指令,赋值给order3
}
p = strtok(NULL," ");
}
}
//显示当前所在目录的路径名
void myPath()
{
char *path = NULL;
path = getcwd(NULL,0); //复制当前工作目录的绝对路径
puts(path);
free(path);
}
//输出当前目录下的所有目录及文件
void openFile()
{
DIR *dirptr=NULL; //定义目录操作数据流
struct dirent *entry;
if((dirptr = opendir("."))==NULL) //通过一个目录路径返回一个对该目录数据流操作的DIR
{
printf("打开文件失败!");
}
else
{
while((entry=readdir(dirptr)) != NULL) //返回当前DIR中的目录或者文件实体
{
if(strcmp(entry->d_name,".")==0 || strcmp(entry->d_name,"..")==0) //用于清除 .和.. 的路径名
{
continue;
}
printf("%s\t",entry->d_name);
}
closedir(dirptr);
}
}
//列出指定目录名中的所有目录及文件
void openFiles(char pathName[])
{
DIR *dirptr=NULL; //定义目录操作数据流
struct dirent *entry;
if((dirptr = opendir(pathName))==NULL) //通过一个目录路径返回一个对该目录数据流操作的DIR
{
printf("打开文件失败!");
}
else
{
while((entry=readdir(dirptr)) != NULL) //返回当前DIR中的目录或者文件实体
{
if(strcmp(entry->d_name,".")==0 || strcmp(entry->d_name,"..")==0) //用于清除 .和.. 的路径名
{
continue;
}
printf("%s\t",entry->d_name);
}
closedir(dirptr);
}
}
//改变当前工作目录
void changePath(char pathName[])
{
if(chdir(pathName)==0)
{
printf("当前工作目录为: %s \n", getcwd(NULL, 0));
}
else
{
printf("%s路径不存在!\n",pathName);
}
}
//新建目录
void newFile(char fileName[])
{
if(mkdir(fileName,S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH) == 0)
{
printf("%s 创建成功!\n",fileName);
}
else
{
printf("mkdir:无法创建目录\"%s\"文件已存在!\n",fileName);
}
}
//删除目录
void deleteFile(char fileName[])
{
if(rmdir(fileName) == 0)
{
printf("%s 删除成功!\n",fileName);
}
else
{
printf("rmdir:未能删除\"%s\":没有此类文件或目录不为空!\n",fileName);
}
}
//重命名一个文件或目录
void changeFileName(char oldName[],char newName[])
{
if(rename(oldName,newName)==0)
{
printf("%s修改成功!\n",newName);
}
else
{
printf("%s该目录或文件不存在!",oldName);
}
}
//复制一个已存在的文件
int copyFile(char oldName[],char newName[])
{
const char *pathName = newName;
int in, out,flag;
char buf[1024];
int sign = 0;
in=open(oldName,O_RDONLY,S_IRUSR|S_IWUSR); //以只读的方式打开文件
if(in<0)
{
printf("%s打开文件失败!%s创建文件失败!\n",oldName,newName);
return sign;
}
out=open(pathName,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR); //以读写的方式打开或创建一个文件
if(out<0)
{
printf("%s创建文件失败!\n",newName);
return sign;
}
while((flag=read(in,buf,1024))>0) //循环读写文件
{
write(out,buf,flag);
sign = 1;
}
close(in); //关闭文件
close(out); //关闭文件
return sign;
}
//在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径。
void findFile(char filePath[])
{
DIR *sp;
if((sp = opendir(filePath)) == 0) //打开文件夹,不存在返回0
{
printf("\"%s\"打开文件路径失败!",filePath);
return ;
}
else
{
ftw(filePath,findName,500); //递归式遍历子目录
}
if(fileFlag==0) //判断是否找到文件的绝对路径
{
printf("该\"%s\"目录及其子目录下的\"%s\"文件不存在!",filePath,findFileName);
}
closedir(sp);
}
// 输出查找到的文件的绝对路径。
int findName(const char *file , const struct stat *sb ,int flag)
{
if(flag == FTW_F) //读取一般文件
{
char * p;
char filePath[100]; //定义用于存放要查找的文件路径
char fileNames[20]; //定义用于存放要查找的文件名
strcpy(filePath,file); //复制要查找的文件路径
p = strtok(filePath,"/"); //用 / 分割文件路径,用于找到文件名
while(p)
{
strcpy(fileNames,p); //复制最后一个文件名
p = strtok(NULL,"/");
}
if(strcmp(findFileName,fileNames)==0) //判断文件名是否与要查找的文件名相同
{
printf("\n绝对路径为:%s\n",file);
fileFlag++; //标记找到查找文件的绝对路径
}
}
return 0;
}
//输出系统信息
void systemMessage()
{
printf("------------------------------------------------------------------------------------------------------------------------------------------------------\n");
printf("----------------------------------------------在Linux环境下模拟实现简单命令解释器---------------------------------------------------------------------\n");
printf("----------------------------------------专业:*************** 作者:****** 序号:** -----------------------------------------------------------\n");
printf("------------------------------------------------------------------------------------------------------------------------------------------------------\n");
printf("-----------------------------支持命令有:pwd list changedir makedir deldir rename copy find help exit----------------------------------------\n");
printf("---------------------------------pwd :显示当前所在目录的路径名-------------------------------------------------\n");
printf("---------------------------------list <目录名> :列出指定目录名中的所有目录及文件-----------------------------------------\n");
printf("---------------------------------changedir <目录名或路径> :改变当前工作目录---------------------------------------------------------\n");
printf("---------------------------------makedir <目录名> :新建目录-----------------------------------------------------------------\n");
printf("---------------------------------deldir <目录名> :删除目录-----------------------------------------------------------------\n");
printf("---------------------------------rename <旧文件名> <新文件名> :重命名一个文件或目录-----------------------------------------------------\n");
printf("---------------------------------copy <已存在的文件名> <副本文件名或路径> :复制一个已存在的文件-----------------------------------------------------\n");
printf("---------------------------------find <目录> -name <待查找的文件名> :在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径。---\n");
printf("---------------------------------help :输出系统帮助命令---------------------------------------------------------\n");
printf("---------------------------------exit :退出命令解释程序---------------------------------------------------------\n");
printf("------------------------------------------------------------------------------------------------------------------------------------------------------\n\n");
}
//输出系统帮助函数
void helpMessage()
{
printf("------------------------------------------------------------------------------------------------------------------------------------------------------\n");
printf("-----------------------------支持命令有:pwd list changedir makedir deldir rename copy find help exit----------------------------------------\n");
printf("---------------------------------pwd :显示当前所在目录的路径名-------------------------------------------------\n");
printf("---------------------------------list <目录名> :列出指定目录名中的所有目录及文件-----------------------------------------\n");
printf("---------------------------------changedir <目录名或路径> :改变当前工作目录---------------------------------------------------------\n");
printf("---------------------------------makedir <目录名> :新建目录-----------------------------------------------------------------\n");
printf("---------------------------------deldir <目录名> :删除目录-----------------------------------------------------------------\n");
printf("---------------------------------rename <旧文件名> <新文件名> :重命名一个文件或目录-----------------------------------------------------\n");
printf("---------------------------------copy <已存在的文件名> <副本文件名或路径> :复制一个已存在的文件-----------------------------------------------------\n");
printf("---------------------------------find <目录> -name <待查找的文件名> :在指定的目录及其子目录中查找指定的文件,并输出查找到的文件的绝对路径。---\n");
printf("---------------------------------help :输出系统帮助命令---------------------------------------------------------\n");
printf("---------------------------------exit :退出命令解释程序---------------------------------------------------------\n");
printf("------------------------------------------------------------------------------------------------------------------------------------------------------\n\n");
}
开发环境:ubuntu
编译代码前,需要下载C语言的编译器。需要在Ubuntu的终端下执行如下命令:
sudo apt-get install gcc
编译执行命令:
gcc -o Linux Linux.c
./Linux
注意:Linux.c是文件名称,Linux是编译后的执行文件
执行效果:
完整代码下载!!!
资源下载路径一
资源下载路径二
!!!