编程实现一个简单的迷你型操作系统文件管理功能模块,基本功能包括: (1) 显示系统当前用户,当前工作目录。 (2) 显示指定文本文件的内容,文件名称由键盘输入。 (功能类似命令 cat aa.txt ) (3) 显示指定文件的名称,大小,权限等信息,文件名称由键盘输入。 (功能类似命令 ls –l aa.txt ) (4) 文件复制功能,源文件,目标文件名均由键盘输入 (功能类似命令cp aa.txt bb.txt ) (5)创建文件功能(文本文件) (功能类似命令touch aa.txt )
#include <stdio.h>
#include <sys/types.h>
#include<sys/stat.h>
#include<errno.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<syslog.h>
#include<string.h>
#include<stdlib.h>
#include<dirent.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<utmp.h>
#include<pthread.h>
#define MAX 1000
void show_info(struct utmp* utbufp)
{
if(utbufp->ut_type!=USER_PROCESS)
return;
printf("%-8.8s", utbufp->ut_name);
printf(" ");
printf("%-8.8s", utbufp->ut_line);
printf(" ");
printf("(%s)", utbufp->ut_host);
printf("\n");
}
int main()
{
int fd,fd1,fd2,utmpfd,num,choice,del,i;
struct utmp current_record;
int reclen = sizeof current_record;
int n=0;
char buffer[MAX],file[20],file1[20],file2[20];
char *buff=NULL;
struct stat statbuf={0};
while(1)
{
printf("\n**************************************\n");
printf("0. 退出系统\n");
printf("1. 查看系统当前用户\n");
printf("2. 显示系统当前目录\n");
printf("3. 创建文件\n");
printf("4. 输入文件内容\n");
printf("5. 查看文件内容\n");
printf("6. 显示文件信息\n");
printf("7. 文件复制功能\n");
printf("8. 删除文件\n");
printf("**************************************\n");
printf("请选择相关操作:");
scanf("%d",&choice);
switch(choice)
{
case 0: exit(0);
case 1:
if ((utmpfd = open(UTMP_FILE, O_RDONLY)) == -1)
{
perror(UTMP_FILE);
exit(1);
}
while (read(utmpfd, ¤t_record, reclen) == reclen)
{
show_info(¤t_record);
}
close(utmpfd);
break;
case 2:
if(NULL==getcwd(buffer,MAX))
perror("getcwd");
printf("当前目录为:%s\n",buffer);
break;
case 3:
printf("请输入要创建的文件名:\n");
scanf("%s",file);
fd=open(file,O_WRONLY,0644);
if(fd==-1)
printf("文件创建失败");
else
printf("文件创建成功");
break;
case 4:
printf("请输入要打开的文件名:\n");
scanf("%s",file);
fd = open(file,O_WRONLY);
if(fd==-1)
{
printf("文件打开失败,请检查是否存在!:\n");
}
else
{
printf("请输入文件内容,长度小于128个字符:\n");
num = read(0,buffer,MAX);
write(fd,buffer,num);
printf("文件输入成功!\n");
}
break;
case 5:
printf("请输入要打开的文件名!\n");
scanf("%s",file);
fd = open(file,O_RDONLY,0750);
if(fd==-1)
{
printf("文件不存在!\n");
break;
}
num = read(fd,buffer,MAX);
printf("文件内容为\n");
write(1,buffer,num);
break;
case 6:
printf("输入想要查看的文件名\n");
scanf("%s",file);
if((lstat(file,&statbuf))==-1){
perror("stat fail");
exit(1);
}
switch (statbuf.st_mode & S_IFMT) {
case S_IFBLK: printf("b"); break;
case S_IFCHR: printf("c"); break;
case S_IFDIR: printf("d"); break;
case S_IFIFO: printf("p"); break;
case S_IFLNK: printf("l"); break;
case S_IFREG: printf("-"); break;
case S_IFSOCK: printf("s"); break;
default: printf("?"); break;
}
char f_mode[10]={0};
char tmp_buf[]="rwxrwxrwx";
for(i=0;i<9;i++)
{
if(statbuf.st_mode & (1<<(8-i)))
f_mode[i]=tmp_buf[i];
else
f_mode[i]='-';
}
printf("%s ",f_mode);
printf("%ld ",statbuf.st_nlink);
struct passwd *uid=getpwuid(statbuf.st_uid);
struct group *gid=getgrgid(statbuf.st_gid);
printf("%s %s\t",uid->pw_name,gid->gr_name);
printf("%8ld ",statbuf.st_size);
struct tm *t=gmtime(&(statbuf.st_atime));
printf("%d月 %d %d:%d ",t->tm_mon,t->tm_mday,t- >tm_hour,t->tm_min);
if((statbuf.st_mode& S_IFMT)==S_IFLNK){
char sym_buf[50]={0};
readlink(file,sym_buf,sizeof(sym_buf));
printf("%s -> %s",file,sym_buf);
}
else
printf("%s",file);
printf("\n");
break;
case 7:
printf("输入想要复制的源文件和目标文件\n");
scanf("%s %s",file1,file2);
fd1=open(file1,O_RDWR);
int size=lseek(fd1,0,SEEK_END);
lseek(fd1,0,SEEK_SET);
buff=(char *)malloc(sizeof(char)*size+8);
int n_read=read(fd1,buff,size);
fd2=open(file2,O_RDWR|O_CREAT,0600);
int n_write=write(fd2,buff,size);
close(fd1);
close(fd2);
break;
case 8:
printf("输入要删除的文件名:\n");
scanf("%s",file);
fd = open(file,O_RDONLY,0750);
if(fd==-1)
{
printf("文件不存在\n");
}
int ret = unlink(file);
printf("文件删除成功\n");
if(ret < 0)
{
perror("删除失败");
}
break;
default :
break;
}
}
}
程序运行截图如下:
|