版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统课程设计报告设计题目:多用户、多级目录结构文件系统的设计与实现班 级:计算机1202班组长学号:20123843设计时间:2015年7月46摘要文件是具有文件名的一组关联信息的集合,通常文件由若干个记录组成。文件系统是操作系统与管理文件有关的软件和数据集合。从用户的角度看,文件系统实现“按名存取”。从系统的角度看,文件系统是对文件存储器的存储空间进行组织、分配负责文件的存储并对存入的文件实施保护、检索的一组软件集合。为使用户能灵活方便地使用和控制文件,文件系统提供了一组进行文件操作的系统调用:建立文件、删除文件、打开文件、关闭文件、读文件和写文件本文通过分析上课所述的有关文件系统内容,
2、学习老师提供的实现设计,按照任务书的说明,在组员的共同努力下,自主设计数据结构与相关算法,模拟了一个简易文件系统。能够实现多用户、多级目录,并用成组链接法实现空闲磁盘块分配与回收。该文件系统提供用户登录、目录管理、文件管理等功能,可满足用户日常使用。通过这次课程设计,我们加深了对操作系统中文件系统的理解,了解了文件系统中文件的物理存储结构。关键词:操作系统,文件系统。目 录摘要31 概述51.1 概要设计51.2 基本原理52 课程设计任务及要求52.1 设计任务52.2 设计要求63. 算法及数据结构63.1算法的总体思想(流程)63.2系统初始化和安装模块63.2.1功能63.2.2数据结
3、构73.3 磁盘管理模块83.3.1功能83.3.2 数据结构83.3.3算法83.4 用户模块93.4.1 功能93.4.2 数据结构93.5 目录管理模块93.5.1功能93.5.2 数据结构93.6 文件管理模块103.6.1功能103.6.2 数据结构104. 程序设计与实现124.1 程序流程图124.2 程序说明184.3 实验结果195. 结论236 参考文献237. 收获、体会和建议241 概述1.1 概要设计本文基于操作系统文件管理,设计实现一个多用户、多级目录结构的文件系统,主要实现了多用户(user0,user1,user2)、多级目录、系统初始化(format)、用户登
4、录(login)、显示命令帮助(help)、列出文件目录(dir)、创建目录(cdir)、改变目录(cd)、文件的创建(create)、文件的读(read)、文件的写(edit)、文件的删除(del)、文件的重命名(rename)、注销登录(logout)、退出(quit)等相关功能。1.2 基本原理本系统采用磁盘存储方式,空闲磁盘块采用成组链接法分配与回收。系统主要数据结构如下:2 课程设计任务及要求2.1 设计任务模拟UNIX(或LINUX,或FAT)系统的文件管理功能。包括:多用户 :usr1, , usr8 (1-8个用户)多级目录:可有多级子目录具有login (用户登录)系统初始化
5、(建文件卷、提供登录模块)文件的创建: create文件的打开:open文件的读:read文件的写:write模拟UNIX(或LINUX,或FAT)系统的文件管理功能。包括:文件关闭:close删除文件:delete创建目录:mkdir改变目录:chdir列出文件目录:dir退出:logout格式化:format以上是基本内容,可以根据实际文件系统提供的命令和系统调用,自己增 加和实现附加的功能。2.2 设计要求1、在深入理解操作系统基本原理的基础上,对于选定的题目,以小组为单位,先确定设计方案;2、设计系统的数据结构和程序结构,设计每个模块的处理流程。要求设计合理;3、编程序实现系统,要求实
6、现可视化的运行界面,界面应清楚地反映出系统的运行结果;4、确定测试方案,选择测试用例,对系统进行测试;5、运行系统并要通过验收,讲解运行结果,说明系统的特色和创新之处,并回答指导教师的提问;3. 算法及数据结构3.1算法的总体思想(流程)文件系统由每块1024字节的若干磁盘块组成。磁盘块由文件目录、磁盘i节点和超级块管理。采用成组链接法分配和回收block块。3.2系统初始化和安装模块3.2.1功能该模块实现的功能有系统初始化和载入。系统初始化是指将已定义好的磁盘结构写入磁盘,包括用户信息、初始用户目录、超级块信息以及磁盘i位图和block块位图初始状态。系统安装是指将上次保存的文件系统重新读
7、取出来。3.2.2数据结构该模块主要的数据结构包括磁盘块结构、i结点结构、超级块结构和目录项结构。/*磁盘块结构*/struct block/一个块占1KB int n; /存放空闲盘快的个数 int free50; /存放空闲盘快的地址 int a; /盘快是否被占用标志 char content1000;/快上每个字节存放的符号memory20449;/*超级块结构*/struct block_super int n; /空闲的盘快的个数 int free50; /存放进入栈中的空闲块super_block;/*i结点结构*/struct node /i结点信息 int file_styl
8、e; /i结点 文件类型 int file_length; /i结点 文件长度 int file_address100; /文件占用的物理块号。 int limit;/打开读写权限,0表示能打开读写,1表示能打开读,2表示能打开写,3表示只能打开 int file_UserId; i_node640;/*目录项结构*/struct dir /目录项信息 char file_name10; /文件名 int i_num; /文件的结点号 char dir_name10; /目录名或者说文件所在目录root640;3.3 磁盘管理模块3.3.1功能该模块包括i节点和block块的分配。本系统采用成
9、组链接法对block块进行分配和回收。3.3.2 数据结构该模块的主要数据结构用到磁盘块结构和超级快结构。/*磁盘块结构*/struct block/一个块占1KB int n; /存放空闲盘快的个数 int free50; /存放空闲盘快的地址 int a; /盘快是否被占用标志 char content1000;/快上每个字节存放的符号memory20449;/*超级块结构*/struct block_super int n; /空闲的盘快的个数 int free50; /存放进入栈中的空闲块super_block;3.3.3算法该模块采用成组链接法管理block块。将空闲块分成若干组,每
10、50个空闲块为一组,每组的第一空闲块登记了下一组空闲块的物理盘块号和空闲块总数。如果一个组的第二个空闲块号等于0,则有特殊的含义,意味着该组是最后一组,即无下一个空闲块。将第一组放入超级快中。分配空闲块的时候,从前往后分配,先从第一组开始分配,第一组空闲的50块分完了,才进入第二组。释放空闲块的时候正好相反,从后往前分配,先将释放的空闲块放到第一组,第一组满了,在第一组前再开辟一组,之前的第一组变成第二组。3.4 用户模块3.4.1 功能该模块包括用户登录和注销。用户通过正确的用户名和密码,即可登录系统。用户可以创建文件或目录,但是只能管理自己创建的文件或目录。3.4.2 数据结构本系统中用户
11、信息包括用户id、用户名、密码。具体定义如下所示。string UserName8 = "user0", "user1", "user2", "user3", "user4", "user5","user6", "user7"string PassWord8 = "12345","12345","12345","12345","12345"
12、;,"12345","12345","12345"UserName数组下标即用户ID。3.5 目录管理模块3.5.1功能 该模块包括列出目录下文件、创建目录、打开目录、删除目录等功能。用户可以创建不重名的目录,如果发现重名目录,则系统不允许创建。列出文件目录命令将当前所在目录下的所有子目录及文件。打开目录命令能切换当前目录。删除目录时首先会判断所要删除的目录下是否有文件,如果有,则不允许删除,否则可将目录删除。3.5.2 数据结构/*目录项结构*/struct dir /目录项信息 char file_name10; /文件名 int
13、 i_num; /文件的结点号 char dir_name10; /目录名或者说文件所在目录root640;/*i结点结构*/struct node /i结点信息 int file_style; /i结点 文件类型 int file_length; /i结点 文件长度 int file_address100; /文件占用的物理块号。 int limit;/打开读写权限,0表示能打开读写,1表示能打开读,2表示能打开写,3表示只能打开 int file_UserId; i_node640;I节点中的文件类型为0时代表该文件是目录文件,可以进行相关目录操作。3.6 文件管理模块3.6.1功能该模块
14、包括文件的创建、文件的打开与关闭、文件的读、文件的写、文件的删除等功能。用户可以创建不重名的文件,如果发现重名文件,则系统不允许创建。文件的读命令将文件内容显示在屏幕上。文件的写命令能添加文件内容。文件的删除命令将文件删除。3.6.2 数据结构该模块主要的数据结构包括磁盘块结构、i结点结构、超级块结构和目录项结构。/*磁盘块结构*/struct block/一个块占1KB int n; /存放空闲盘快的个数 int free50; /存放空闲盘快的地址 int a; /盘快是否被占用标志 char content1000;/快上每个字节存放的符号memory20449;/*超级块结构*/str
15、uct block_super int n; /空闲的盘快的个数 int free50; /存放进入栈中的空闲块super_block;/*i结点结构*/struct node /i结点信息 int file_style; /i结点 文件类型 int file_length; /i结点 文件长度 int file_address100; /文件占用的物理块号。 int limit;/打开读写权限,0表示能打开读写,1表示能打开读,2表示能打开写,3表示只能打开 int file_UserId; i_node640;/*目录项结构*/struct dir /目录项信息 char file_nam
16、e10; /文件名 int i_num; /文件的结点号 char dir_name10; /目录名或者说文件所在目录root640;4. 程序设计与实现4.1 程序流程图系统流程图登录login创建目录create_dir删除目录del_dir创建文件create_file删除文件del_file打开文件open关闭文件close 写文件write读文件read磁盘块回收callback磁盘块分配allot;4.2 程序说明本文件系统是用C语言编写而成,该系统提供以下功能: 0.初始化-format 1.查看当前目录文件列表-dir 2.查看文件信息-cat-(cat + 空格 + 文件名)
17、 3.查看系统信息-ls 4.创建目录-md-(md + 空格 + 目录名) 5.创建文件-vi-(vi + 文件名 + 文件长度 + 权限) 6.删除文件-del-(del + 空格 + 文件名) 7.打开文件-open-(open + 空格 + 文件名) 8.关闭文件-close-(close + 空格 + 文件名) 9.读取文件-read-(read + 空格 + 文件名) 10.写入文件-write-(write + 空格 + 文件名+ 空格 + 写入字符) 11.删除目录-deldir-(deldir + 空格 + 目录名) 12.进入当前目录下的指定目录-cd-(cd + 空格 +
18、 目录名) 13.返回上一级目录-cd. 14.显示帮助命令-help 15.退出文件系统-quit 16.退出登录-logout 输入相应命令即可执行对应功能。注意事项:创建的文件长度 < 1004.3 实验结果文件系统执行过程如下图所示。图4-1登录界面图4-2帮助界面图4-3创建目录图4-4创建文件截图图4-5读文件及写文件截图图4-6文件的删除截图图4-8显示文件属性截图图4-9打开目录截图图4-9返回上级目录截图5. 结论本次课程设计,我们组设计实现了一个多用户、多级目录下的文件管理系统,本系统以成组链接法管理磁盘,主要实现了多用户、多级目录、用户登录、创建目录、改变目录、文件
19、的创建、文件的打开、关闭、读、写、删除、注销登录等相关功能,完成了课程设计要求的基本功能,系统能够正常运行并能够进行格式化操作。通过这次课程设计,我们对于日常使用的文件系统有了进一步了解,并且对于文件系统中文件的内部存储结构有了更清楚的认识。6 参考文献1 汤子瀛.计算机操作系统(第三版)M.西安:电子科技大学出版社,20072庞丽萍.操作系统原理M.武汉:华中科技大学出版社,20003张尧学、 史美林.计算机操作系统教程 ( 第二版 ) M.北京:清华大学出版社,20004张丽芬,刘立雄,王全玉.操作系统实验教程M.北京:清华大学出版社,20
20、107. 收获、体会和建议课程设计进行了三周周,是一次将书本知识应用到实践考验。经过一周设计,渐渐参透书本上的基础知识并应用到实践,并且主动去搜集和寻找相关的资料,自学一些相关的知识。在这次课设过程中,我们通过查阅资料,了解了一些不同的文件系统管理的方法,通过不断的修改完善,最终实现了这个相对完整的系统。在文件系统的设计过程中,我们不仅巩固了课堂上所学习到的知识,也提高了我们的编程能力和项目设计能力。尽管在设计过程中遇到了许多困难,但在林树宽老师和张一飞老师的帮助下,组员间的通力协作下,基本得到了克服。因此,我们特别感谢两位老师。通过这次课程设计,我们收获了一次宝贵的经验,弥补了我们在知识和技
21、能方面的不足之处,这些都将在我们今后的工作和学习中起到基石的作用。操作系统课程设计也许是我们在大学本科阶段做的最后一门课程设计,我们待它也是格外重视。许多个日日夜夜,经过了多次的修改完善,程序的每一行代码,都是我们经过反复推敲后确定的。我们的设计也许存在着许多的不足之处,但绝对是我们的心血之作。源码#include "stdio.h"#include <stdlib.h>#include <conio.h>#include <string>#include <windows.h>#include <iostream>
22、;using namespace std;string UserName8 = "user0", "user1", "user2", "user3", "user4", "user5","user6", "user7"string PassWord8 = "12345","12345","12345","12345","12345",&q
23、uot;12345","12345","12345"int login_userid=-1;/if login_userid=0 then UserNamelogin_userid="user0"int file_array8=-1,-1,-1,-1,-1,-1,-1,-1;/ 打开文件表组int file_array_head;int physic100; /文件地址缓冲区int style=1; /文件的类型char cur_dir10="filsystem" /当前目录struct command
24、char com10;cmd17;struct block/一个块占1KB int n; /存放空闲盘快的个数 int free50; /存放空闲盘快的地址 int a; /盘快是否被占用标志 char content1000;/快上每个字节存放的符号memory20449;struct block_super int n; /空闲的盘快的个数 int free50; /存放进入栈中的空闲块 /int stack50; /存放下一组空闲盘快的地址super_block;struct node /i结点信息 int file_style; /i结点 文件类型 int file_length; /
25、i结点 文件长度 int file_address100; /文件占用的物理块号。 int limit;/打开读写权限,0表示能打开读写,1表示能打开读,2表示能打开写,3表示只能打开 int file_UserId; i_node640;/每个I节点占32字节struct dir /目录项信息 char file_name10; /文件名 int i_num; /文件的结点号 char dir_name10; /目录名或者说文件所在目录root640;void format() /格式化 int i,j,k; super_block.n=50; for(i=0;i<50;i+) /超级
26、块初始化 super_block.freei=i; /存放进入栈中的空闲块 /super_block.stacki=50+i; /存放下一组的盘块 for(i=0;i<640;i+) /i结点信息初始化 for(j=0;j<100;j+) i_nodei.file_addressj=-1;/文件地址 i_nodei.limit=-1; i_nodei.file_length=-1; /文件长度 i_nodei.file_style=-1; /文件类型 i_nodei.file_UserId=-1;/用户ID for(i=0;i<640;i+) /目录项信息初始化 strcpy
27、(rooti.file_name,""); rooti.i_num=-1; strcpy(rooti.dir_name,""); for(i=0;i<20449;i+) /存储空间初始化 memoryi.n=0; /必须有这个 memoryi.a=0; for(j=0;j<50;j+) memoryi.freej=-1; int c; for(c=0;c<1000;c+) memoryi.contentc='0' for(i=0;i<20449;i+) /将空闲块的信息用成组链接的方法写进每组的最后一个块中 /存储
28、空间初始化 if(i+1)%50=0) k=i+1; for(j=0;j<50;j+) if(k<20450) memoryi.freej=k;/下一组空闲地址 memoryi.n+; /下一组空闲个数 注意在memoryi.n+之前要给其赋初值 k+; else memoryi.freej=-1; memoryi.a=0; /标记为没有使用 continue; /处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环 for(j=0;j<50;j+) memoryi.freej=-1; memoryi.n=0; int l; for(l=0;l<8;l+) file_
29、arrayl=-1; file_array_head=0; int u; for(u=0;u<100;u+) physicu=-1; printf("已经初始化完毕n"); printf("进入UNIX文件模拟.nn");void callback(int length);void allot(int length) /分配空间 int i,j,k,m,p; for(i=0;i<length;i+) k=50-super_block.n; /超级块中表示空闲块的指针 m=super_block.freek; /栈中的相应盘块的地址 p=sup
30、er_block.free49; /栈中的最后一个盘块指向的地址 if(p=-1/*|memoryp.a=1*/) /没有剩余盘块 printf("内存不足,不能够分配空间n"); callback(i);/之前已分配的i个盘块回收; break; if(super_block.n=1) memorym.a=1; /将最后一个盘块分配掉 physici=m; super_block.free49=-1; super_block.n=0; for(j=50-memorym.n;j<50;j+) /从最后一个盘块中取出下一组盘块号写入栈中 super_block.free
31、j=memorym.freej; super_block.n+; continue; /要跳过这次循环,下面的语句在IF中已经执行过 physici=m; /如果栈中超过一个盘,栈中的相应盘块的地址写进 文件地址缓冲区 memorym.a=1; m=-1; super_block.n-; void callback(int length) /回收磁盘空间 int i,j,k,m,q=0; for(i=length-1;i>=0;i-) k=physici; /需要提供要回收的文件的地址 m=49-super_block.n; /回收到栈中的哪个位置 if(super_block.n=50
32、) /注意 当super_block.n=50时 m=-1;的值 /super_block.n=50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中 for(j=0;j<50;j+) memoryk.freej=super_block.freej; int u; for(u=0;u<50;u+) super_block.freeu=-1; /super_block.stacku=memoryk.freeu; super_block.n=0; memoryk.n=50; memoryk.a=0; if(m=-1) m=49; /将下一个文件地址中的盘块号回收到栈底中,这个地址
33、中存放着刚才满栈的地址的信息 super_block.freem=physici; /将下一个文件地址中的盘块号回收到栈中 super_block.n+; void create_file(char filename,int length,int userid,int limit) /创建文件 int i,j; for(i=0;i<640;i+) if(strcmp(filename,rooti.file_name)=0) printf("已经存在同名文件,不允许建立重名的文件n"); return; for(i=0;i<640;i+) if(rooti.i_n
34、um=-1) rooti.i_num=i; strcpy(rooti.file_name,filename); strcpy(rooti.dir_name,cur_dir); /把当前目录名 给新建立的文件 i_nodei.file_style=style;/style=0 说明文件是目录文件 i_nodei.file_length=length; i_nodei.limit=limit; i_nodei.file_UserId=userid; /printf("%s.%dn",rooti.file_name,i_nodei.file_UserId); allot(leng
35、th); for(j=0;j<length;j+) i_nodei.file_addressj=physicj; int u; for(u=0;u<100;u+)/分配完清空缓冲区 physicu=-1; break; void del_file(char filename) /删除文件 int i,j,k; for(i=0;i<640;i+) if(strcmp(filename,rooti.file_name)=0)&&(strcmp(cur_dir,rooti.dir_name)=0)&&(i_noderooti.i_num.file_U
36、serId=login_userid) /printf("1get heren"); int add,c; for(add=0;add<i_noderooti.i_num.file_length;add+)/文件内容清空 for(c=0;memoryi_noderooti.i_num.file_addressadd.contentc!='0'c+) memoryi_noderooti.i_num.file_addressadd.contentc='0' k=rooti.i_num; /printf("2get heren&qu
37、ot;); i_nodek.file_UserId=-1; i_nodek.limit=-1; for(j=0;j<i_nodek.file_length;j+) physicj=i_nodek.file_addressj; / printf("get heren"); callback(i_nodek.file_length); /调用 回收函数 int u;/回收完情空缓存区 for(u=0;u<100;u+) physicu=-1; for(j=0;j<100;j+) /删除文件后要将文件属性和目录项的各个值恢复初值 i_nodek.file_add
38、ressj=-1; /文件占用的块号地址恢复初值 strcpy(rooti.file_name,""); /文件名恢复初值 rooti.i_num=-1; /目录项的I结点信息恢复初值 strcpy(rooti.dir_name,""); /目录项的文件目录信息恢复初值 i_nodek.file_length=-1; /文件长度恢复 i_nodek.file_style=-1; /文件类型恢复初值 break; if(i=640) printf("登录用户的该目录下不存在这个文件n"); void display_sys() /显示系
39、统信息(磁盘使用情况) int i,m,k=0; for(i=0;i<20449;i+) if(memoryi.a=0) k+; m=20449-k; printf("空闲的盘块数是:t"); printf("%dn",k); printf("使用的盘块数是:t"); printf("%dn",m);void show_file(char filename) /显示文件信息 int i,j,k; printf("tt文件名字 文件类型 文件长度 读取权限 所属目录t所属用户n"); for
40、(i=0;i<640;i+) k=rooti.i_num; if(strcmp(filename,rooti.file_name)=0 && (i_nodek.file_style=1) printf("tt %st",rooti.file_name); /文件名 printf("t%dt",i_nodek.file_style); /文件的类型 printf("%dt",i_nodek.file_length); /文件的长度 printf("%dt",i_nodek.limit); pri
41、ntf("%st",rooti.dir_name); /文件所在的目录 printf("user%dn",i_noderooti.i_num.file_UserId); printf("tt文件占用的物理地址n"); for(j=0;j<i_nodek.file_length;j+) /显示物理地址 printf("%d ",i_nodek.file_addressj); /文件具体占用的盘块号 printf("n"); break; if(i=640) printf("没有这个
42、文件 或者这个文件不是正规文件n"); /shhchvoid write_file(FILE *fp) /将信息写入系统文件中 int i; fp=fopen("system","wb"); for(i=0;i<20449;i+) fwrite(&memoryi,sizeof(struct block),1,fp); fwrite(&super_block,sizeof(struct block_super),1,fp); for(i=0;i<640;i+) fwrite(&i_nodei,sizeof(st
43、ruct node),1,fp); for(i=0;i<640;i+) fwrite(&rooti,sizeof(struct dir),1,fp); fclose(fp);void read_file(FILE *fp) /读出系统文件的信息 int i; fp=fopen("system","rb"); for(i=0;i<20449;i+) fread(&memoryi,sizeof(struct block),1,fp); fread(&super_block,sizeof(struct block_super
44、),1,fp); for(i=0;i<640;i+) fread(&i_nodei,sizeof(struct node),1,fp); for(i=0;i<640;i+) fread(&rooti,sizeof(struct dir),1,fp); fclose(fp);int login() system("title 用户登录界面 "); printf("nn 用户名:"); string tempusername; cin>>tempusername; /cout<<tempusername!;
45、 int i=0; for(i=0;i<8;i+) if(tempusername=UserNamei) printf(" 密码:"); string temppassword; cin>>temppassword; if(temppassword=PassWordi) login_userid=i; printf("登录成功,请稍等n"); for(int a =0; a<4; a+) Sleep(500); printf("."); return 0; else system("cls"
46、); printf("密码错误n输入y:重新登录n输入n:退出系统n"); getchar(); char c=getchar(); getchar(); if(c='y'|c='Y') system("cls"); login(); return 0; if(c='n'|c='N') exit(0); if(i=8) system("cls"); printf("没有此用户n输入y:重新登录n输入n:退出系统n"); getchar(); char
47、c=getchar(); getchar(); if(c='y'|c='Y') system("cls"); /i=0; login(); return 0; if(c='n'|c='N') exit(0); return 0;void logout()/*退出*/ printf(" n Logouting"); for(int a =0; a<4; a+) Sleep(500); printf("."); system("cls");int open(char filename10) int i; for(i=0;i<640;i+) if(strcmp(rooti.file_name,filename)=0 && i_noderooti.i_num.file_style=1 && i_noderooti.i_num.fil
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度新能源项目聘用管理合同
- 二零二五年度企业风险管理课程合同范本
- 2025年度解聘劳动合同补偿标准与员工健康保障服务合同
- 2025年度生物制药研发人员简易劳动合同样板
- 2025年文化设计创意版权许可合同
- 2025年地产竞业禁止合同
- 2025年旅游医疗机构体验合同
- 2025年家庭中央净水器购买合同
- 2025年借壳上市合同转让流程
- 农业机械居间承诺合同
- 《中国心力衰竭诊断和治疗指南(2024)》解读完整版
- 2025年中考物理终极押题猜想(新疆卷)(全解全析)
- GB/T 32399-2024信息技术云计算参考架构
- 五级人工智能训练师(初级)职业技能等级认定考试题库(含答案)
- 2022年内蒙古呼和浩特市中考化学真题(解析版)
- 2024PowerTitan系列运维指导储能系统运维指导
- 沸石转轮知识讲解
- 固定资产盘点报告医院版
- 肿瘤患者全程管理
- DB13(J)T145-2012建筑工程资料管理规程(上册)
- 企业职务犯罪法制讲座课件
评论
0/150
提交评论