




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统原理课程设计实践报告题目:LINUX文件管理系统的仿真实现姓名:关子俞、温季逾、田耕苗学院:信息科技技术学院专业:计算机科学技术班级:计科121学号:19212108、19212128、333导教师:姜海燕职称:教授是否申请优秀:否2015年3月18日目录TOC\o"1-3"\h\u83951.目的与意义 2262552.理论分析 3231962.1文件系统结构 3123822.2文件目录结构 3213892.3文件的逻辑结构 335982.4文件的物理结构 4322702.5系统调用的实现 4277652.6文件共享 4202792.7文件空间管理 485753.核心技术以及技术路线 4280794.功能设计、结构设计、核心算法以及数据结构 5266114.1功能设计 594354.2结构设计 7211144.3数据结构以及核心算法 798014.3.1初始化/格式化format模块 7142794.3.2用户登录模块 8132414.3.3存储空间管理 10268964.3.4文件目录 14241174.3.5查看磁盘使用情况 16197674.3.6文件操作:新建、翻开、关闭、读、写、重命名、删除、错误提示 17110244.3.7定义全局变量 2236684.3.8核心数据结构 23137734.3.9硬链接 24134425.运行环境、调试分析 25241165.1运行环境 2582195.2调试分析 25194916.讨论 2899246.1存在问题 2879056.2改良建议 28291837.实践体会以及心得 28操作系统中LINUX文件管理系统的仿真实现计科121 关子俞,温季逾,田耕苗指导教师 姜海燕摘要:文件系统是操作系统中负责存取和管理信息的模块,它采用统一方法管理用户信息和系统信息的存储、检索、更新、共享和保护,并为一欧诺个户提供一整套行之有效的文件使用及操作方法。对于系统而言,必须采用特定的数据结构和有效算法,实现文件的逻辑结构到存储结构的映射,实现对文件存储空间和文件信息的管理,提供多种存取方法。本次的文件管理系统的仿真实现可以模拟完成用户的登陆和验证,列出文件和目录,新建目录,改变目录,创立和编写文件,删除文件和退出系统等功能。关键字:操作系统;文件系统;仿真;计算机1.目的与意义进入20世纪90年代以后,计算机科学技术突飞猛进,操作系统又是计算机领域最活泼的分支之一,操作系统的新概念新技术和新方法层出不穷,促使现代操作系统发生了巨大的变化。所以开设操作系统课程设计是非常重要的,可让学生充分了解传统操作系统的根本概念技术方法,又能融合现代操作系统最新技术开展和应用的讨论,将操作系统理论知识和实践实习紧密的结合起来。既有利于学生的知识获取,又有利于学生的能力培养。而在整个操作系统中,文件系统的作用是至关重要的,它是用户和系统的中枢结构,是一架桥梁。文件系统的存在可以实现文件的按名存取,实现从逻辑文件到物理文件的转换,文件目录的建立和维护,文件的查找和定位,文件存储空间的分配和管理,提供文件的存取方法和文件存储结构,实现文件的共享保护和保密,提供一组易用的文件操作和命令等,提高了整个系统的资源利用率。2.理论分析2.1文件系统结构文件系统通常采用分层结构实现,大致分为三层:文件管理、目录管理和磁盘主存映射管理。〔1〕文件管理层实现文件的逻辑结构,为用户提供各种文件系统调用,及文件访问权限设置等工作;〔2〕目录管理负责查找文件描述符,今儿找到需要访问的文件,并进行访问权限检查等工作;〔3〕磁盘主存映射管理将文件的逻辑地址转换成磁盘的物理地址,即由逻辑块号找到柱面号、磁道号和扇区号,集体数据传输操作由设备管理实现。2.2文件目录结构UNIX采用树型目录结构,每个目录表称为一个目录文件。一个目录文件是由目录项组成的。每个目录项包含16B,一个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。UNIX中的文件系统磁盘存储区分配图如下:0#1#2#…K#K+1#K+2#K+3#…n#i节点区i节点区文件存储区引导区管理区 2.3文件的逻辑结构文件的逻辑结构和组织是从用户的观点出发,研究用户概念中抽象的信息组织方式,这是用户能观察到的客家处理的数据集合。忧郁数据可独立于物理环境构造故称逻辑结构,相关数据的集合构成逻辑文件。系统提供假设干操作以便使用者构造文件,如此用户可不顾文件的物理结构利用文件名就能进行有关操作。文件的逻辑结构分为流式文件和记录式文件两种根本形式。记录成组和分解处理能节省存储空间提高系统效率,缺点是需要软件进行成组和分解的额外操作以及需要较大的I/O缓冲区。2.4文件的物理结构文件的物理结构和组织是指逻辑文件在物理存储空间中的存放方法和组织关系,这使得文件看做物理文件,即相关物理块的集合。构造文件物理结构有两种方法即计算法和指针法。其中计算法是指通过用线性计算法、杂凑法等通过记录键进行计算转换成对应物理地址的方法,存取效率较高;指针法那么是设置专门的指针致命相应记录的物理地址或表达各记录之间的关联,索引文件属于此类,该方法便于随机存取更新,加快存取速度。根据实际情况有顺序文件、连接文件、直接文件和索引文件三种文件物理结构。2.5系统调用的实现文件系统向应用程序提供的一组系统调用包括:建立、翻开、关闭、撤销、读、写和控制,通过这些用户能获得文件系统的各种效劳。一般提供创立、删除、翻开、关闭、读写、随机存取等操作。2.6文件共享文件共享是指不同的进程共同使用一个文件,文件共享不仅为不同的进程完成共同任务所必需,而且还节省大量的辅存空间,减少因文件复制而增加的I/O操作次数,一般有静态共享、动态共享和符号链接共享三种形式。在UNIX/Linux系统中,允许多个用户静态共享或动态共享同一个文件,当一个文件被多个进程动态的共享使用时,每个进程可以使用各自的读写指针,但也可以共用读写指针。2.7文件空间管理在磁盘等大容量辅助存储器空间中,用户作业运行期间经常要建立、扩充和删除文件,文件系统应能自动管理和控制辅存文件空间。辅存文件空间分配常以连续分配和非连续分配两种方法进行分配。而文件辅存空间管理方法通常有:位示图、空闲区表、空闲块链和成组空闲块链四种。3.核心技术以及技术路线 采用二级目录结构,其中第一级对应于用户账号,第二级对应于用户账号下的文件。模拟实现多用户多目录的文件系统,在系统出现登录后,输入用户与口令,在用户登录系统后,可建立文件卷,将用户输入的文件保存在指定的文件中。系统的命令与其命令的具体实现,此模拟系统共提供了上述命令,并根据命令的含义与要求,用C编程来完成所有具体操作。该系统可以模拟完成用户的登陆和验证,列出文件和目录,新建目录,改变目录,创立和编写文件,删除文件和退出系统等功能。我们从系统抽取模拟建立512个块,每个块对应512个字节,然后建立一个有512个元素的字符数组,每个元素对应相应的块号,不管是文件或是目录都有i节点,建立自己设定数目元素的i节点表,并依次把位图区、i节点表、数据块区每个元素映射到一个二进制文件上。在每一次的操作中如果相应元素有变动,那么对应在文件中更新输出相应数据,以便下一次启动程序的时候可以快速导入上一次的数据,并且建立保护机制,即当翻开某个文件时,将其记录下来使无法同时再次翻开。总体框架如图-1-。图-SEQ图表\*ARABIC1-系统总体框架图4.功能设计、结构设计、核心算法以及数据结构4.1功能设计1.多用户、多级目录结构文件系统的设计与实现。可以实现以下几条命令login用户登录logout退出当前用户dir列文件目录creat创立文件delet删除文件及目录树open翻开文件close关闭文件read读文件write写文件mkdir创立目录cd改变文件目录format格式化文件系统quit退出文件系统rename重命名link硬链接
图-SEQ图表\*ARABIC2-总功能结构图图-SEQ图表\*ARABIC3-总功能流程图4.2结构设计系统结构如图-1-采用二级目录结构,其中第一级对应于用户账号,第二级对应于用户账号下的文件。不管是文件或是目录都有i节点,建立自己设定数目元素的i节点表,并依次把位图区、i节点表、数据块区每个元素映射到一个二进制文件上。在每一次的操作中如果相应元素有变动,那么对应在文件中更新输出相应数据,以便下一次启动程序的时候可以快速导入上一次的数据,并且建立保护机制。4.3数据结构以及核心算法4.3.1初始化/格式化format模块格式化文件系统,即初始化文件系统,相当于硬盘的格式化。将其中原有的用户及用户下的文件系统全部复原初始状态,即没有任何用户和目录、文件,也就是按设计的文件系统格式重建新的文件系统。voidformat(void){ Inodeinode; scanf("%c",&choice);getchar(); if((choice=='y')||(choice=='Y')) { if((fp=fopen(image_name,"w+b"))==NULL) { printf("无法创立文件%s\n",image_name); exit(-1);} for(i=0;i<BLKSIZE;i++) fputc('0',fp);初始化节点信息 for(i=0;i<31;i++) fwrite(&inode,sizeof(Inode),1,fp);for(i=0;i<BLKNUM*BLKSIZE;i++) fputc('\0',fp);fclose(fp); //翻开文件user.txt if((fp=fopen("user.txt","w+"))==NULL) {printf("无法创立文件%s\n","user.txt"); exit(-1);} printf("文件系统创立成功,请首次登陆!\n"); }}4.3.2用户登录模块功能:用户登陆,如果是新用户那么创立用户voidlogin(void){ charfile_name[10]="user.txt"; do { gets(user_name); while(*p=getch()) {if(*p==0x0d){ *p='\0';//将输入的回车键转换成空格 break;} printf("*");//将输入的密码以"*"号显示 p++; } if((fp=fopen(file_name,"r+"))==NULL) {printf("\n无法翻开文件%s.\n",file_name); printf("这个文件系统不存在,它将被创立!\n"); format(); login();}while(!feof(fp)) { fread(&user,sizeof(User),1,fp); //已经存在的用户,且密码正确 if(!strcmp(user.user_name,user_name)&&!strcmp(user.password,password)){ fclose(fp); printf("\n"); return;} //已经存在的用户,但密码错误 elseif(!strcmp(user.user_name,user_name)) { printf("\n密码错误.\n"); fclose(fp); break;} } if(flag==0)break; }while(flag); //创立新用户 if(flag==0) {printf("\n是否创立新用户?(y/n):"); scanf("%c",&choice); if((choice=='y')||(choice=='Y')) { 赋值 fwrite(&user,sizeof(User),1,fp); fclose(fp); return;} if((choice=='n')||(choice=='N')) login(); }}voidfree_user()//清空内存中存在的用户名4.3.3存储空间管理voidinit(void)//将所有i节点读入内存{ if((fp=fopen(image_name,"r+b"))==NULL) printf("无法翻开文件%s.\n",image_name); //读入位图 for(i=0;i<BLKNUM;i++) bitmap[i]=fgetc(fp); //显示位图 //读入i节点信息 for(i=0;i<INODENUM;i++) fread(&inode_array[i],sizeof(Inode),1,fp); //显示i节点 //当前目录为根目录 inum_cur=0; //初始化翻开文件表 for(i=0;i<FILENUM;i++) file_array[i].inum=-1;}voidsave_inode(intnum)//功能:将num号i节点保存到hd.dat{ if((fp=fopen(image_name,"r+b"))==NULL) { printf("无法翻开文件%s\n",image_name); exit(-1); } fseek(fp,BLKNUM+num*sizeof(Inode),SEEK_SET); fwrite(&inode_array[num],sizeof(Inode),1,fp); fclose(fp);}intget_blknum(void)//找到一个空闲数据块,并修改对应位图号元素为1{ inti; for(i=0;i<BLKNUM;i++) if(bitmap[i]=='0')break; //未找到空闲数据块 if(i==BLKNUM) { printf("数据块已满.\n"); exit(-1); } bitmap[i]='1'; if((fp=fopen(image_name,"r+b"))==NULL) {printf("无法翻开文件%s\n",image_name); exit(-1); } fseek(fp,i,SEEK_SET); fputc('1',fp); fclose(fp);}voidrelease_blk(intnum)//修改对应的位图元素,并把文件系统中对应的数据 //块清零{ FILE*fp; if((fp=fopen(image_name,"r+b"))==NULL) {printf("无法翻开文件%s\n",image_name); exit(-1); } bitmap[num]='0'; fseek(fp,num,SEEK_SET); fputc('0',fp); fclose(fp);}4.3.4文件目录voidpathset()//设置文件路径{ charpath[50]; intm,n; if(inode_array[inum_cur].inum==0)strcpy(path,user.user_name); else { strcpy(path,user.user_name); m=0; n=inum_cur; while(m!=inum_cur) { while(inode_array[n].iparent!=m) {n=inode_array[n].iparent;} strcat(path,"/"); strcat(path,inode_array[n].file_name); m=n; n=inum_cur;} } printf("用户/路径:[%s]",path);}voidcd(void)//切换目录(cd..或者cddir1){ inti; if(argc!=2) { printf("该命令必须要有两个参数.\n"); return; } if(!strcmp(argv[1],".."))inum_cur=inode_array[inum_cur].iparent; else { for(i=0;i<INODENUM;i++) if((inode_array[i].inum>0)&&(inode_array[i].type=='d')&& (inode_array[i].iparent==inum_cur)&& !strcmp(inode_array[i].file_name,argv[1])&&!strcmp(inode_array[i].user_name,user.user_name))break;if(i==INODENUM) printf("此目录不存在.\n");elseinum_cur=i; }}voidmkdir(void)//在当前目录下创立子目录(mkdirdir1){ inti; if(argc!=2) { printf("该命令必须要有两个参数.\n"); return; } //遍历i节点数组,查找未用的i节点 for(i=0;i<INODENUM;i++) if(inode_array[i].inum<0)break;if(i==INODENUM) { printf("i节点已满.\n"); exit(-1); } inode_array[i].inum=i; strcpy(inode_array[i].file_name,argv[1]); inode_array[i].type='d'; strcpy(inode_array[i].user_name,user.user_name); inode_array[i].iparent=inum_cur; inode_array[i].length=0; save_inode(i);}4.3.5查看磁盘使用情况voiddir(void){ inti; intdcount=0,fcount=0; shortbcount=0; if(argc!=1) { printf("该命令必须要有一个参数.\n"); return; } //遍历i节点数组,显示当前目录下的子目录和文件名 for(i=0;i<INODENUM;i++) if((inode_array[i].inum>0)&& (inode_array[i].iparent==inum_cur)&& !strcmp(inode_array[i].user_name,user.user_name)){ if(inode_array[i].type=='d') {dcount++;printf("%-20s<DIR>\n",inode_array[i].file_name);} else{fcount++; bcount+=inode_array[i].length; printf("%-20s%12dbytes\n",inode_array[i].file_name,inode_array[i].length);}} printf("\n%dfile(s)%11dbytes\n",fcount,bcount); printf("%ddir(s)%11dbytesFreeSpace\n",dcount,1024*1024-bcount); }4.3.6文件操作:新建、翻开、关闭、读、写、重命名、删除、错误提示//功能:在当前目录下创立文件(creatfile)voidcreate(void){ for(i=0;i<INODENUM;i++) {if((inode_array[i].inum>0)&&(inode_array[i].type=='f')&& !strcmp(inode_array[i].file_name,argv[1])&& inode_array[i].iparent==inum_cur){ printf("该文件已存在.\n");} } for(i=0;i<INODENUM;i++)if(inode_array[i].inum<0)break; if(i==INODENUM) { printf("Inodeisfull.\n"); exit(-1); } 更新节点信息 save_inode(i);//保存节点信息 for(n=0;n<SFILENUM;n++)if(Sfile_array[n].a_num<0)break; if(n==SFILENUM)更新系统翻开文件表信息//功能:文件的重命名voidrename(void){ inti,n; charname[100]; if(argc!=2) {printf("该命令必须要有两个参数.\n");return; } for(i=0;i<INODENUM;i++) {if((inode_array[i].inum>0)&&(inode_array[i].type=='f')&& strcmp(inode_array[i].file_name,argv[1])==0){ printf("请输入新的文件名"); gets(name); inode_array[i].inum=i; strcpy(inode_array[i].file_name,name); inode_array[i].type='f'; strcpy(inode_array[i].user_name,user.user_name); inode_array[i].iparent=inum_cur; inode_array[i].length=0; inode_array[i].file_ilink=0; save_inode(i); } } for(n=0;n<SFILENUM;n++) { if((Sfile_array[n].a_num==i)&& (strcmp(Sfile_array[n].filename,argv[1])==0)) { Sfile_array[n].a_num=i; strcpy(Sfile_array[n].filename,name); } }}voidopen()//翻开文件,并判断文件类型和翻开方式{ for(i=0;i<INODENUM;i++) if((inode_array[i].inum>0)&&(inode_array[i].type=='f')&& !strcmp(inode_array[i].file_name,argv[1])&& !strcmp(inode_array[i].user_name,user.user_name))break; if(i==INODENUM) { printf("你想翻开的文件不存在.\n"); } printf("请输入文件模式:(1:read,2:write,3:readandwrite):"); scanf("%d",&mode); getchar(); if((mode<1)||(mode>3)) { printf("文件模式错误.\n"); } for(i=0;i<FILENUM;i++)if(file_array[i].inum<0)break; if(i==FILENUM) {printf("文件翻开表已满,请关闭一些文件.\n"); return; } filenum=i; file_array[filenum].inum=inum;strcpy(file_array[filenum].file_name,inode_array[inum].file_name); file_array[filenum].mode=mode; printf("Openfile%sby",file_array[filenum].file_name); if(mode==1)printf("readonly.\n"); elseif(mode==2)printf("writeonly.\n"); elseprintf("readandwrite.\n");}voidclose(void)//关闭文件,删除该文件的用户翻开文件表目{ for(i=0;i<FILENUM;i++) if((file_array[i].inum>0)&& !strcmp(file_array[i].file_name,argv[1]))break; if(i==FILENUM) { printf("该文件无法翻开.\n"); return; } else { file_array[i].inum=-1; printf("Close%ssuccess!\n",argv[1]); }}voidwrite()//写文件,需要先翻开文件并判断文件权限。写完后修改文件系统中的对应数据区。{ for(i=0;i<FILENUM;i++) if((file_array[i].inum>0)&&!strcmp(file_array[i].file_name,argv[1]))break;if(i==FILENUM) { printf("Open%sfirst.\n",argv[1]); return; } elseif(file_array[i].mode==1) { printf("Can'twrite%s.\n",argv[1]); return; } inum=file_array[i].inum; printf("Thelengthof%s:%d\n",inode_array[inum].file_name,inode_array[inum].length); if(inode_array[inum].length==0) { i=0;inode_array[inum].address[0]=get_blknum(); printf("输入文件内容(输入CTRL+Z结束):\n"); while(i<1023&&(temp[i]=getchar())!=EOF)i++;temp[i]='\0'; length=strlen(temp)+1;inode_array[inum].length=length; if(length>512)inode_array[inum].address[1]=get_blknum();save_inode(inum); write_blk(inum); } else printf("这个文件不能被写入.\n");}voidread()//读文件,需先翻开文件,读入相应数据块的内容到缓冲区,然后输出。{ for(i=0;i<FILENUM;i++)if((file_array[i].inum>0)&&!strcmp(file_array[i].file_name,argv[1])) break; if(i==FILENUM) { printf("Open%sfirst.\n",argv[1]); } elseif(file_array[i].mode==2) { printf("Can'tread%s.\n",argv[1]); } inum=file_array[i].inum; printf("%s的文件长度为:%d.\n",argv[1],inode_array[inum].length); if(inode_array[inum].length>0) { read_blk(inum); for(i=0;(i<inode_array[inum].length)&&(temp[i]!='\0');i++) printf("%c",temp[i]); }}voiddel(inti)//如果参数是文件那么删除文件,如果是目录那么删除该目录下的所有文件和目 录。voiddel(inti){ inode_array[i].inum=-1; if(inode_array[i].length>0) { release_blk(inode_array[i].address[0]); if(inode_array[i].length>=512)release_blk(inode_array[i].address[1]); } save_inode(i);}4.3.7定义全局变量char choice;int argc; //用户命令的参数个数char *argv[5]; //用户命令的参数int inum_cur; //当前目录char temp[2*BLKSIZE]; //缓冲区User user; //当前的用户char bitmap[BLKNUM]; //位图数组Inode inode_array[INODENUM]; //i节点数组File_tablefile_array[FILENUM]; //翻开文件表数组char image_name[10]="data.dat"; //文件系统名称FILE *fp; //翻开文件指针4.3.8核心数据结构//用户typedefstruct{ charuser_name[10]; //用户名 charpassword[10]; //密码}User;〔功能:管理用户〕//i节点typedefstruct{ shortinum;//文件i节点号 charfile_name[10];//文件名 chartype;//文件类型 charuser_name[10];//文件所有者 shortiparent;//父目录的i节点号 shortlength;//文件长度 shortaddress[2];//存放文件的地址 intfile_ilink;//链接计数器}Inode;//翻开文件表typedefstruct{ shortinum; //i节点号 charfile_name[10];//文件名 shortmode; //读写模式(1:read,2:write, //3:readandwrite)}File_table;//系统翻开表项typedefstruct{ charfilename[10]; //文件名称 shorta_num; //指针,指向活动i结点 shortiparent;//父目录的i节点号}System_table;〔主要为了实现文件共享〕4.3.9硬链接//硬链接(只能在当前目录下创立硬链接,并且只能链接当前目录下的文件)voidh_link(void){ if(i==INODENUM) { printf("你所要链接的文件不存在.\n"); } node=inode_array[i].inum; ++inode_array[i].file_ilink; printf("请输入新建文件的名字:"); gets(name); for(i=0;i<INODENUM;i++) {if((inode_array[i].inum>0)&&(inode_array[i].type=='f')&& !strcmp(inode_array[i].file_name,name)){ printf("该文件名已存在,请重新输入指令.\n"); return;} } for(n=0;n<SFILENUM;n++)if(Sfile_array[n].a_num<0)break; Sfile_array[n].a_num=node; strcpy(Sfile_array[n].filename,name); Sfile_array[n].iparent=inum_cur; //遍历i节点数组,查找未用的i节点 for(i=0;i<INODENUM;i++) if(inode_array[i].inum<0)break;if(i==INODENUM) { printf("i节点已满.\n"); } 更新节点信息 save_inode(i);//保存节点信息}5.运行环境、调试分析5.1运行环境MicrosoftVisualC++6.05.2调试分析首次运行wenjian.exe文件时,系统将提示用户初始化文件系统,之后进入用户登录界面,首次登录需要新建用户,用户可根据自己喜好来输入用户名和密码〔如以下图一〕,登录后便可进入文件系统,用户可直接输入help显示帮助菜单来查看可以进行的操作,如下中图中的新建目录及显示目录〔图二〕,新建文件、翻开文件以及读写文件〔图三〕,删除根目录下所有子目录和文件〔图五〕,以及退出当前用户〔图六〕和退出文件系统〔图七〕。其中用户更改目录时只需输入cd空格后再加上要进入的目录名即可,返回父目录是还可输入cd空格后加..即可。此外,用户在翻开已存在的文件是需要选择文件的读写模式,并且用户在写文件以及读文件时系统会自动给出该文件长度。第一次运行程序图一建立新目录,显示当前目录下的文件和目录图二建立新的文件,翻开,写,读。图三clear清屏后,dir查看当前目录下文件信息图四返回根目录下,并删除根目录下所有子目录和文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 出租车客运服务承包与大数据分析协议
- 生态农业园区场地租赁及农产品销售合作协议
- 车辆运输安全培训与咨询承包协议
- 车辆过户手续全权委托合同样本
- 特色餐饮厨师定制合同书
- 车辆托管与汽车保险代理合作协议
- 车辆维修费用赔偿与保险理赔协议
- 会说话的动物课件
- 生命教育主题班会
- 护士外出培训
- 医院收款室岗位职责
- 《安全吊装作业培训》课件
- 分析化学知到智慧树章节测试课后答案2024年秋海南大学
- 开封市第二届职业技能大赛工业4.0项目技术文件(世赛选拔项目)
- 形势与政策(贵州财经大学)知到智慧树章节答案
- 2024江苏社区工作者试题汇编
- 第四单元《遵守法律规范》测试卷-高二思想政治课《职业道德与法治》附答案
- 工贸行业法律法规清单法规清单
- 物业服务品质提升培训
- 中国执业医师法课件
- 申论大学生村官考试试题及答案指导(2025年)
评论
0/150
提交评论