+模拟UNIX文件系统的设计及实现_第1页
+模拟UNIX文件系统的设计及实现_第2页
+模拟UNIX文件系统的设计及实现_第3页
+模拟UNIX文件系统的设计及实现_第4页
+模拟UNIX文件系统的设计及实现_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、*实践教学*兰州理工大学计算机与通信学院2008年秋季学期操作系统原理课程设计题 目:模拟UNIX文件系统专业班级:计算机一班姓 名:张树伟学 号:06240121指导教师:刘嘉成 绩:目录1. 摘要 2. 问题描述3. 设计目的4. 设计要求5. 详细设计2 2. 2. 2 35.1 界面设计 3.5.1 算法设计 36.设计总结 47.参考文献 48.致谢 5第 1 页 总 36 页目录第 # 页 总 36 页目录9. 附录3.4.第 # 页 总 36 页模拟UNIX文件系统的设计及实现1.课程设计内容多用户的多级目录的文件系统设计2.概述UNIX采用树型目录结构,每个目录表称为一个目录文

2、件。一个目录文件是由目录项组成的。每个目录项包含16B, 个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识; 后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对 照关系。根据文件名可以找到辅存 i节点号,由此便得到该文件的所有者、存取权、文件 数据的地址健在等信息。UNIX的存储介质以512B为单位划分为块,从0开始直到最大容 量并顺序加以编号就成了一个文件卷,也叫文件系统。UNIX中的文件系统磁盘存储区分配图如下:2#K#K+1#K+2#K+3#n#引导区管理区,?节点区文件存储区本次课程设计是要实现

3、一个简单的模拟UNIX文件系统。我们在内存中开辟一个虚拟磁盘空间(1MB)作为文件存储器,并将该虚拟文件系统保存到磁盘上(以一个文件的形式),以便下次可以再将它恢复到内存的虚拟磁盘空间中。文件存储空间的管理可采用位示图方 法。3.课程设计任务及要求3.1.设计任务多用户、多级目录结构文件系统的设计与实现。可以实现下列几条命令logi n用户登录logout退出当前用户dir列文件目录creat创建文件delete删除文件ope n打开文件close关闭文件read读文件write写文件mkdir创建目录ch改变文件目录rd删除目录树formatquit格式化文件系统 退出文件系统32设计要求1

4、)多用户:usr1,usr2,usr3,”,usr8 (1-8个用户)2)多级目录:可有多级子目录;4)系统初始化(建文件卷、6)文件的打开:open8)文件的写:write10)删除文件:delete12)改变当前目录:cd14)退出:logout3)具有login (用户登录)提供登录模块)5)文件的创建:create用命令行来实现)7)文件的读:read9)文件关闭:close11)创建目录(建立子目录):mkdir13)列出文件目录:dir新增加的功能:15)删除目录树:rd佝格式化文件系统:format4.算法及数据结构4.1.算法的总体思想本课程设计是要求我们模拟 UNIX文件系统

5、功能设计一个虚拟文件系统,依据UNIX文件系统的特点,其设计思想是:申请1M的内存空间来虚拟文件系统,将其以 512B每块划分2048块,采用位示图管 理文件系统的方法,利用其原理将第1块作为位图区(512B),共有对i节点区和数据块区分 别建立位图;每个i节点占16B,每块有512/16=32个i节点,用2、3共两块作为i节点, 总共有64个i节点,在位图区占用8B;其余2045块作为数据区(本课设要求只用到512块), 在位图区占用接近 256B(2045位)。文件系统存储区分配图如下:位图区i节点区数据区位图:用0表示未使用,1表示使用;i节点:文件控制块(FCB),描述文件信息的一个数

6、据结构;数据区:存放用户数据,包括目录文件。位示图用以反映整个存储空间的分配情况,由若干字节构成,每个字节中的每一位对 应文件存储器中的一块,“ 1”状态表示相应块已占用,“ 0”状态表示该块为空闲。存储块 分配时,只要把找到的空闲块所对应的位由 "0"改为"1",而在释放时,只要把被释放的 物理块所对应的位由"1"改为"0 "即可。分配和释放都可以在内存的位示 图上完成,而且速度较快。磁盘i节点利用在内存中生成链表或者数组的方法来生成,并且限制磁盘节 点数的最大值。同样内存i节点利用链表的方法在内存中生成。同时在

7、往文件中写或者读的时候我们都是对内存中有内容进行读写。在该文件系统中,规定一个文件最多只能占用2个数据块,这两个数据块可以是不连续的,其块号记录在一个索引块中,该索引块称为in ode结构。读入一个文件时,先根据目录找到相应的i节点号,将i节点读入主存i节点,建立打 开文件表指向该主存i节点,再将文件内容读入主存数据区。42系统总体框架图辅存©*0J fl «bitmaptemp1024Bmotie an»y32个位图i节点数据区512B艾个皿块第5页总36页第#页总36页4.3.系统总体流程图第#页总36页.用户登录模块,输入用户名和密码,可以 *在程序中设定,

8、不用保存在文件系统中执行init(),进行初始化操作,进入用户子目录执行command。,对用户输入的命令进行解析和 执行。若数据被修改或新建立,则保存主存i节点和数据块的内容到内存的文件系统,并写回磁 盘,保存修改。若输入错误命令则显示岀错信息44各模块功能说明4.4.1 format 模块功能:格式化文件系统,即初始化文件系统,相当于硬盘的格式化。将其中原有的用户 及用户下的文件系统全部还原初始状态,即没有任何用户和目录、文件,也就是按设计的 文件系统格式重建新的文件系统。4.4.2 get_blknum 和 release_blk模块功能:实现i节点的分配和回收;算法:当一个新的文件被建

9、立时,在给该文件分配磁盘存储区之前,应为该文件分配 存放该文件的说明信息的磁盘i节点。反之,当从文件系统中删除某个文件时,则要首先 删除它的i节点项。4.4.3 in it()模块功能:进入文件系统算法:初始化用户打开文件系表。在内存中申请一个虚拟存储空间,此空间必须大于第#页总36页或等于可格式化时的空间。将文件系统文件读入虚拟磁盘。444 quit()模块功能:退出文件系统函数 quit() 算法:将虚拟磁盘内容保存到磁盘上。释放虚拟磁盘所占据的空间。撤消用用户打开 文件表。4.4.5 Creat()f 块功能:创建文件用法: creat filename算法:分配一空目录项, 分配磁盘块

10、。可用位示图。填写该空目录项。 如文件长度(0), 文件名,类型等。分配一个用户打开文件表项,并填写相关目录,读写指针=0。4.4.6 ope n(模块功能:打开文件 open()用法: open filename算法:if (该文件已打开or该文件不存在)报错(出错信息)。分配一个用户打开文件表 项。4.4.7 close(模块功能:关闭文件 close()用法: close filename 算法:释放该文件的用户占据的内存空间。清空该文件的用户打开文件表目。4.4.8 write()模块功能:写文件 write(fd,buf,len)用法:write file name,需要先打开文件。

11、算法:指定写入内容长度。buf。修改打开文件表读/写指针。修改目录项中的文件长度。4.4.9 read(模块功能: read(fd, buf, len)用法:read file name需先打开文件。算法:文件信息 .修改读/写指针。4.4.10 delete(模 块功能:删除文件 delete()用法: delete filename 算法:若文件不存在,报错。回收磁盘空间。回收目录项。第 6 页 总 36 页4.5. 该文件系统的数据结构和申明函数 / 用户 (20B) typedef structchar user_name10;char password10; User;/ 用户名/

12、密码/ i 节点 (32B) typedef struct short inum; charfile_name10; chartype;/ 文件 i 节点号/ 文件名/ 文件类型char user_name10; / 文件所有者short iparent;short length;short address2; Inode;/ 父目录的 i 节点号/ 文件长度/ 存放文件的地址/ 打开文件表 (16B) typedef structshort inum;char file_name10;short mode;short offset; File_table;/ i 节点号/ 文件名/ 读写模式

13、 (1:read, 2:write, 3:read and write) / 偏移量/ 申明函数 void login(void); void init(void); int analyse(char *); void save_inode(int); int get_blknum(void); void read_blk(int);用户登录,如果是新用户则创建用户 程序初始化 ,将所有 i 节点读入内存 输入参数分析,分析用户命令 将 num 号 i 节点保存到虚拟磁盘文件 hd.dat 申请一个数据块将 i 节点号为 num 的文件读入 temp第 7 页 总 36 页void write

14、_blk(int);void release_blk(i nt);void pathset();void deltree(i nt innu m); int check(i nt);/用户命令处理函数void help(void);void cd(void);void dir(void);void mkdir(void);void rd(void);void creat(void);void ope n(v oid);void read(void);void write(void);void close(void);void del(void);void logout(void); void

15、comma nd(void);void format(void);将temp的内容写入hd.dat的数据区释放文件块号为num的文件占用的空间打印当前路径实现删除目录树函数检查用户权限命令提示帮助函数改变当前目录显示当前目录下所有文件和目录创建目录删除目录创建文件打开读文件写文件关闭文件删除文件用户注销命令管理函数格式化虚拟磁盘5.程序设计与实现5.1.主要函数列表函数原型功能入口、出口参数说明void log in(v oid)用户登陆void in it(void)程序初始化int an alyse(char *)输入参数分析命令行字符串void save_i no de(i nt)保存i

16、节点到虚拟磁盘文件i节点号int get_blk num (void)分配一个磁盘块void read_blk(i nt)读磁盘快内容i节点号void write_blk(i nt)写磁盘块i节点号void release_blk(i nt)释放一个磁盘块i节点号void pathset();打印当前路径void deltree(i nt innu m);实现删除目录树函数i节点号int check(i nt);检查用户权限i节点号void help(void)命令提示帮助函数void dir(void)显示当前目录下所有文件和目 录void mkdir(void)创建目录void creat

17、(void)创建文件void ope n(v oid)打开文件void read(void)读文件void write(void)写文件void close(void)关闭文件void del(void)删除文件void logout(void)用户登出void comma nd(void)命令管理函数void rd(void)删除目录void format(void);格式化虚拟磁盘5.3.程序流程图各功能模块流程图第9页总36页用户登陆login()初始化函数init()改变当前目录cd()显示目录dir()第11页总36页创建目录mkdir()创建文件creat()遍历i节点区遍历i节点

18、区分配一个文件i节点第#页总36页打开文件open()读文件read()遍历打开文件表 file_array文件是否已经打开模式是否为可读提示输入开始位置 和读字节数读出块块操符、结束一写文件write()关闭文件close()第13页总36页删除文件del()第15页总36页删除目录树rd()第#页总36页第#页总36页开始遍历i节点区遍历子目录调用delet()删 除目录或文件第#页总36页第#页总36页结束 I第#页总36页第#页总36页分配磁盘块get_blk()释放磁盘块 release_blk(int)第#页总36页第#页总36页将位示图位置置''bitmapi =

19、 'O'清空块内容第17页总36页读磁盘块 read_blk(int)写磁盘块 write_blk(int)第#页总36页第#页总36页54源程序/*mai n.c*/#in elude "head.h"charchoice;intargc;/用户命令的参数个数char *argv5;/用户命令的参数intinum_cur;/ 当前目录char temp2*BLKSIZE; / 缓冲区 Useruser;/当前的用户charbitmapBLKNUM; / 位图数组In ode in ode_arrayINODENUM;/ i 节点数组File_table f

20、ile_arrayFILENUM; / 打开文 件表数组charimage_name10 = "hd.dat" 文件系 统名称FILE*fp;/ 打开文件指针 创建映像hd,并将所有用户和文件清除void format(void)FILE *fp;int i;Inode ino de;prin tf("Will be to format filesystem.' n");printf("WARNING:ALL DATA ON THIS FILESYSTEM WILL BE LOST!n");prin tf("Proc

21、eed with Format(Y/N)?");scanf("%c", &choice);gets(temp);if(choice = 'y') | (choice = 'Y')if(fp=fope n(image_ name, "w+b")= NULL)prin tf("Ca n'tcreate file %sn",image_ name);exit(-1);for(i = 0; i < BLKSIZE; i+)fputc('0', fp);ino de

22、.i num = 0;strcpy(i no de.file_ name, "/");第#页总36页ino de.type = 'd'strcpy(i no de.user_ name, "all");ino de.ipare nt = 0;inode.len gth = 0;ino de.addressO = -1;ino de.address1 = -1;fwrite(&no de, sizeof(I no de), 1, fp);ino de.i num = -1;for(i = 0; i < 31; i+)fwrit

23、e(&no de, sizeof(I no de), 1, fp); for(i = 0; i < BLKNUM*BLKSIZE;i+)fputc('0', fp);fclose(fp);/打开文件user.txtif(fp=fope n("user.txt", "w+") = NULL)prin tf("Ca n'tcreate file %sn","user.txt");exit(-1);fclose(fp);prin tf("Filesystemcreateds

24、uccessful.Please first log in!n ”);return ;/功能:用户登陆,如果是新用户则创建用 户void log in(v oid)char *p;int flag;char user_ name10;char password10;&&第16页总36页char file_ name10 = "user.txt"doprin tf("logi n:");gets(user_ name);prin tf("password:"); p=password;while(*p=getch()if

25、(*p = 0x0d) /当输入回车键时, 0x0d为回车键的ASCII码*p='0' /将输入的回车键转换成空 格break;printf("*");/将输入的密码以"*"号显示P+;flag = 0;if(fp = fopen (file _n ame, "r+")= NULL)prin tf("nCa n'tope nfile %s.n",file_ name);printf("This filesystem not exist, it will be create!n&qu

26、ot;);format();logi n();while(!feof(fp)fread(&user, sizeof(User), 1, fp);/已经存在的用户,且密码正确if(!strcmp(user.user_ name, user_ name)!strcmp(user.password, password)fclose(fp);prin tf("n");return ;/已经存在的用户,但密码错误elseif(!strcmp(user.user_ name,user_ name)printf("nThisuser is exist, butpassw

27、ord is in correct.n");flag = 1;fclose(fp);break;if(flag = 0) break;while(flag);/创建新用户if(flag = 0)printf("nDo you want to creat a new user?(y/n):");scanf("%c", &choice);gets(temp);if(choice = 'y') | (choice = 'Y')strcpy(user.user_ name, user_ name); strcpy

28、(user.password, password); fwrite(&user, sizeof(User), 1, fp); fclose(fp);return ;if(choice = 'n') | (choice = 'N')logi n();/功能:将所有i节点读入内存void in it(void)int i;if(fp = fope n(image_ name, "r+b")= NULL)prin tf("Ca n'tope n file %s.n",image_ name);exit(-1);/

29、读入位图for(i = 0; i < BLKNUM; i+)bitmapi = fgetc(fp);/显示位图/读入i节点信息for(i = 0; i < INODENUM; i+)fread(&inode_arrayi, sizeof(Inode), 1, fp);/显示i节点/当前目录为根目录inu m_cur = 0;/初始化打开文件表for(i = 0; i < FILENUM; i+) file_arrayi.i num = -1;功能:分析用户命令,将分析结果填充argc和 argv/结果:0-14为系统命令,15为命令错误int an alyse(cha

30、r *str)int i;char temp20;char *ptr_char;总36页第17页char*syscmd="help","cd", "dir","mkdir","creat", "open","read", "write","close","delete","logout","clear","format","qu

31、it","rd"argc =0;for(i = 0, ptr_char = str; *ptr_char != '0' ptr_char+)if(*ptr_char !='')while(*ptr_char != ' ' && (*ptr_char != '0')tempi+ = *ptr_char+; argvargc = (char *)malloc(i+1); strncpy(argvargc, temp, i); argvargci = '0'argc+;i =

32、 0; if(*ptr_char = '0') break;if(argc != 0)for(i = 0; (i < 15) && strcmp(argv0, syscmdi); i+);return i;else return 15;/功能:将num号i节点保存到hd.datvoid save_i no de(i nt num)if(fp=fope n(image_ name,"r+ b")=NULL)prin tf("Ca n'tope nfile%sn",第18页image_ name);exit(-1

33、);fseek(fp,512+nu m*sizeof( Ino de),SEEK_SET);fwrite(&ino de_array nu m, sizeof(I no de), 1, fp);fclose(fp);/功能:申请一个数据块int get_blk num (void)int i;for(i = 0; i < BLKNUM; i+)if(bitmapi = '0') break;/未找到空闲数据块if(i = BLKNUM)prin tf("Data area is full.n");exit(-1);bit map i = 

34、9;1'if(fp=fope n(image_ name, "r+b")=NULL)prin tf("Ca n'tope nfile %sn",image_ name);exit(-1);fseek(fp, i, SEEK_SET);fputc('1', fp);fclose(fp);return i;/功能:将i节点号为num的文件读入tempvoid read_blk(i nt num)总36页fclose(fp);int i, le n;char ch;int addO, addl;len = ino de_arra

35、y nu m.le ngth;addO = ino de_array nu m.addressO;if(len > 512)addl = ino de_array nu m.address1;if(fp = fope n(image_ name,"叶 b")= NULL)prin tf("Ca n'tope nfile %s.n",image_ name);exit(-1);fseek(fp,1536+addO*BLKSIZE,SEEK_SET);ch = fgetc(fp);for(i=0; (i < len) &&

36、 (ch != '0') && (i < 512); i+)tempi = ch;ch = fgetc(fp);if(i >= 512)fseek(fp,1536+add1*BLKSIZE,SEEK_SET);ch = fgetc(fp);for(; (i < len) && (ch != '0'); i+)tempi = ch;ch = fgetc(fp);tempi = '0'/功能:将temp的内容输入hd的数据区void write_blk(i nt num)int i, le n;int

37、 add0, add1;add0 = ino de_array nu m.address0;len = ino de_array nu m.le ngth;if(fp = fope n(image_ name, "r+b")= NULL)prin tf("Ca n'tope n file %s.n",image_ name);exit(-1);fseek(fp,1536+add0*BLKSIZE,SEEK_SET);for(i=0;(i<le n)&&(tempi!='0')&&(i<5

38、12); i+)fputc(tempi, fp);if(i = 512)add1 = ino de_array nu m.address1; fseek(fp,1536+add1*BLKSIZE,SEEK_SET);for(; (i < len) && (tempi != '0'); i+) fputc(tempi, fp);fputc('0', fp);fclose(fp);/功能:释放文件块号为num的文件占用的 空间void release_blk(i nt num)总36页第19页FILE *fp;if(fp=fope n(imag

39、e_ name,"叶 b")=NULL)prin tf("Ca n'tope nfile %sn",image_ name);exit(-1);bitmap num = 'O'fseek(fp, num, SEEK_SET);fputc('0', fp);fclose(fp);/功能:显示帮助命令void help(void)printf("command: nhelp - show help menu nclear -clear the scree n ncd- cha nge directory nm

40、kdir - make directory ncreat -create a new file nope n -ope n a exist file nread - read a file nwrite - write someth ing to a file nclose - close a file ndelete -delete a exist file nformat -format a exist filesystem nlogout -exit user nrd- delete a directory nquit - exit this systemn");设置文件路径v

41、oid pathset()int m,n;if(i no de_arrayi num _cur.i num = 0) strcpy(path,user.user_ name);elsestrcpy(path,user.user_ name);m=0;n=inu m_cur;while(m != inu m_cur)while(i no de_array n.ipare nt != m)n = ino de_array n .ipare nt;strcat(path,"/");strcat(path,i no de_array n.file_ name); m = n;n =

42、 inu m_cur;prin tf("%s",path);/功能:切换目录(cd .或者cd dir1)void cd(void)int i;if(argc != 2)prin tf("Comma nd cd must have two args.n");return ;if(!strcmp(argv1, ".")inu m_cur=char path50;else第20页总36页ino de_arrayi num _cur.ipare nt;check(i)/遍历i节点数组for(i = 0; i < INODENUM; i

43、+)if(i no de_arrayi.i num>0)&&(i no de_arrayi.type='d')&&(ino de_arrayi.ipare nt=i num _cur)&&!strcmp(i no de_arrayi.file_ name,argv1)&&check(i)break;if(i = INODENUM)prin tf("This directoryisn'texsited.n");else inu m_cur = i;/功能:显示当前目录下的子目录和文件

44、(dir)void dir(void)int i;int dco un t=0,fc oun t=0;short bco un t=0;if(argc != 1)printf("Command dir must have one args.n");return ;/遍历i节点数组,显示当前目录下的子 目录和文件名for(i = 0; i < INODENUM; i+)if(i no de_arrayi.i num> 0) &&(ino de_arrayi.ipare nt = inu m_cur)if(i no de_arrayi.type=&#

45、39;d'&&一第21页dco un t+;prin tf("%-20s<DIR>n",ino de_arrayi.file_ name);if(i no de_arrayi.type='-'&&check(i)fcoun t+;bco un t+=i no de_arrayi.le ngth;prin tf("%-20s%12dbytesn",ino de_arrayi.file_ name,i no de_arrayi.le ngth );prin tf("n%dfile(

46、s)%11d bytesn",fcou nt,bcou nt);printf("%ddir(s)%11dbytesFreeSpacen",dcou nt,1024*1024-bcou nt);/功能:删除目录树(rd dir1)void rd()int i,j,t,flag=0;if(argc != 2)printf("Command delete must have one args. n");return ;for(i = 0; i < INODENUM; i+)查找待删 除目录if(inode_arrayi.inum > 0)

47、 &&/ 是否为 空总36页(ino de_arrayi.ipare nt = inu m_cur) &&(i no de_arrayi.type = 'd' )&&(!strcmp(i no de_arrayi.file_ name,argv1 )chk=check(i);检查用户权限 if(chk!=1)prin tf("Thisdirectory is notyour !n");return ;else j=i no de_arrayi.i num;for(t=0;t<INODENUM;t+)if(

48、i node_arrayt.i nu m>0)&&(ino de_arrayt.ipare nt=j )&&(ino de_arrayi.type ='-') delet(t);/目录下有文件则删除else if(i no de_arrayt.i num>0)&& (ino de_arrayt.ipare nt=j )&& (i no de_arrayi.type = 'd')delet(t);/目录下有空目录则删除if(t = INODENUM)delet(j);/下层目录为空删除之i

49、f(i = INODENUM)delet(i);/待删除目录为空删除之return;/功能:在当前目录下创建子目录(mkdirdir1)void mkdir(void)if(argc != 2)printf("command mkdir must have two args. n");return ;/遍历i节点数组,查找未用的i节点for(i = 0; i < INODENUM; i+)if(i no de_arrayi.i num < 0) break;if(i = INODENUM)printf("Inode is full.n");e

50、xit(-1);ino de_arrayi.i num = i;strcpy(i no de_arrayi.file_ name, argv1); ino de_arrayi.type = 'd'strcpy(i no de_arrayi.user_ name,user.user_ n ame);ino de_arrayi.ipare nt = inu m_cur;ino de_arrayi.le ngth = 0;save_i no de(i);/功能:在当前目录下创建文件(creat file1) void creat(void)int i;if(argc != 2)pri

51、ntf("command creat must have one args. n");return ;for(i = 0; i < INODENUM; i+)if(i no de_arrayi.i num > 0) &&总36页int i;第22页(ino de_arrayi.type = '-') &&!strcmp(i no de_arrayi.file_ name, argv1)prin tf("This file is exsit.n");return ;for(i = 0; i <

52、; INODENUM; i+)if(ino de_arrayi.i num < 0) break;if(i = INODENUM)printf("Inode is full.n");exit(-1);ino de_arrayi.i num = i;strcpy(i no de_arrayi.file_ name, argv1); ino de_arrayi.type ='-'strcpy(i no de_arrayi.user_ name, user.userjname);ino de_arrayi.ipare nt = inu m_cur;ino d

53、e_arrayi.le ngth = 0;save_i no de(i);功能:打开当前目录下的文件(open filel) void ope n()int i, i num, mode, file nu m,chk;if(argc != 2)prin tf("comma nd ope n must have one args. n");return ;for(i = 0; i < INODENUM; i+)if(i no de_arrayi.i num > 0) &&(ino de_arrayi.type = '-') &

54、;&!strcmp(i no de_arrayi.file_ n ame,argv1)break;if(i = INODENUM)printf("The file you want to opendoes n't exsited. n");return ;inum = i;chk=check(i);if(chk!=1)prin tf("This file is not your !n ”); return ;prin tf("Please in put ope n mode:(1: read2: write, 3: read and write):");sca nf("%d&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论