




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、简单多用户文件系统目录一、课程设计任务描述2二、设计思想说明22.1 对该任务的理解分析22.2 设计任务剖析32.3 程序设计环境及工具选择42.4 函数层次图(即模块关系图)5三、EXT2文件系统简介53.1文件系统概述53.2 EXT2文件系统简介5四、数据设计与表示74.1 头文件说明74.1.1 头文件:types.h74.1.2头文件:filetype.h74.1.3头文件:sys.h84.2数据结构说明84.2.1 超级块(super block)84.2.2 组描述符84.2.3 磁盘索引节点94.2.4 内存索引节点10磁盘目录项结构体104.2.6当前目录结构体114.2.
2、7用户打开文件表结构体114.2.8系统打开文件表结构体114.2.9用户结构体124.3 宏定义说明124.4 主要函数列表134.5 算法流程图14五、数据分析175.1 输入数据175.2 输出数据分析17六、使用说明186.1欢迎界面186.2 用户登陆界面186.3 系统使用界面196.4 创建目录及显示目录界面19七、课程设计总结207.1 与给定文件系统的对比分析207.2 未完成部分及改进方法207.2 课程设计总结20八、参考文献20九、程序源代码及注解21一、课程设计任务描述为LINUX设计一个简单的二级文件系统。要求做到以下几点:1、 可以实现下列几条命令Login 用户
3、登录Dir列文件目录Create创建文件Delete删除文件Open打开文件Close关闭文件Read读文件Write 写文件2、列目录时要列出文件名、物理地址、保护码和文件长度。3、源文件可以进行读写保护。二、设计思想说明2.1 对该任务的理解分析一个文件系统从功能上划分程序为四个部分,第一部分是有关高速缓冲区的管理程序,主要实现了对硬盘等块设备进行数据高速存取的函数;第二部分代码描述了文件系统的底层通用函数,说明了文件索引节点的管理、磁盘数据块的分配和释放以及文件名与i节点的转换算法;第三部分程序是有关对文件中数据进行读写操作,包括对字符设备、管道、块读写文件中数据的访问;第四部分的程序与
4、文件的系统调用接口的实现有关,主要涉及文件打开、关闭、创建以及有关文件目录操作等的系统调用。由于我们不能亲自设计驱动程序,所以我们要模拟文件系统的设计、实现和功能,就不能把它直接做为操作系统实际的文件系统进行挂接。鉴于此,我们就有两个思路来完成该任务,一是在实际的硬盘上创建一个文件,把它做为磁盘进行各种对磁盘的模拟操作,这样做的好处是可以对它进行连续操作,只要在退出文件系统时,及时保存它的状态,当我们下次启动程序时,就能继续以前的操作,相比而言这更接近于实际;二是在内存中开辟一块空间,譬如1M或2M大小,继而对这块内存区域模拟磁盘操作,操作灵活但这样需每次开辟空间,极有可能隐藏一些需要关闭文件
5、系统才能发现的错误,也就是说这样做不易于排错。在本次的课程设计中,我们决定采用第一种方案。由于是在文件级上的操作,所以我们不必去写设备驱动程序,只需要开辟文件调用fwrite、fread、fseek、ftell、fput、fget等库函数进行读写即可。在文件系统四部分程序中,我们只需要编写第二部分文件系统的底层通用函数即可。2.2 设计任务剖析在本次的课程设计中,我们没有沿用课程设计指导书上文件系统的例子程序,而是决定模拟Linux的标准根文件系统EXT2,其原因我们会在课程设计总结中给出。我们认为EXT2主要的设计思想是磁盘分区再分组,数据存储使用混合索引方式。这也是我们要实现的主要功能。在
6、参考了Linux0.11文件系统Minix2.0及Linux2.4EXT2的底层通用函数后,本着设计简单可表达EXT2设计思想的原则,我们需要编写的程序要实现下列功能:l 格式化程序。在硬盘上创建一个文件,用来模拟磁盘;对磁盘按照EXT2文件系统结构进行划分;主要数据的写入,包括根目录、登陆文档、超级块、组描述符的初始化及组描述符表、块位图索引节点位图的初始化及索引节点表。l 磁盘读写函数。这部分的函数要完成的功能包括:读写指定的磁盘块;读写指定的索引节点表和块位图;读写指定的超级块和组描述符。l 数据块分配和回收函数。按照先组从小到大,后逻辑块编号从小到大的顺序分配数据块;回收指定的逻辑块改
7、写相应组内的块位图。l 索引节点分配和回收。按照先组从小到大,后索引编号从小到大的顺序分配索引节点;回收指定的索引节点改写相应组内的索引节点位图。l 目录操作函数。列表显示当前目录内目录项,更改目录及删除目录。l 文件操作函数。组织进程和文件系统的关系,包括用户打开文件表和系统打开文件表的初始化和管理。创建文件、删除文件、打开文件、关闭文件、读文件和写文件。程序是引用文件描述符来操作文件的。l 用户认证。读取文件系统的密码文档,对登陆用户验证。由于EXT2文件系统是相对较大的程序的组合,在较短的时间内很难全面模仿,所以我们对它在不改变其主要设计思想的基础上,进行了适当简化。编写程序时主要遵循的
8、设计思想如下:l 设置全局宏定义。在实际中,文件系统要引用一些常量,是在各种数据结构体中查找的,而我们为了使得程序设计的简单,使用了全局的宏定义,在程序的任何地方都可方便的使用。l 数据分配采用混合索引方式。在数据块的组织上我们使用EXT2的混合索引方式,但我们不准备照搬EXT2的方式,而是把数据指针定为5个,前4个作为直接指针,第5个做为单级指针。这样我们文件系统中文件最大就定为了:(BLOCKSIZE_BT是以字节表示的磁盘块大小)4*BLOCKSIZE_BT+(BLOCKSIZE_BT/4)*BLOCKSIZE_BT=4*512B+(512/4)*512B=67584B=67584B/(
9、1024B/K)=66KBl 目录采用直接指针方式。在创建目录项时,我们把这5个数据指针都作为了直接指针。那么每个目录可包含的目录项为:5*(BLOCKSIZE_BT/DIR_ENTRY_LEN)=40l 在进程和文件系统的关系上,使用了EXT2的组织方式,可用下图表示:2.3 程序设计环境及工具选择该试验程序是小组成员在Windows2000平台下,使用Microsoft Visual C+ 6.0编辑、编译及调试通过的。之所以选择这种组合是在考虑了Windows平台的易用性、广泛性和程序文件转储简单等特性,另外Visual C+可自己组织程序的调用和编译,省去了在Linux平台下使用GNU
10、/GCC书写Makefile文件系统的麻烦。这样可以在较短的时间内完成文件系统复杂程序的编写。考虑到Visual C+是32位的编译器,为了在其他一些16位编译器如TC下编译通过,我们特意为此设计了通用模式。关于此下文有详细的说明。2.4 函数层次图(即模块关系图)图例说明: 为shell调用命令为程序调用函数三、EXT2文件系统简介3.1文件系统概述简单地说,文件系统就是操作系统与存储介质之间交换数据的一种协议约定,它对文件的组织和存取规则进行详细描述,同时保证数据的完整性。有了这种逻辑上的约定,文件系统就不必了解数据块的物理存储位置,它只需保存逻辑块的编号,而对磁盘的物理操作是由文件系统磁
11、盘函数库(Disk Library)中的各种底层函数,通过块设备驱动程序,来完成由逻辑块编号到物理存储位置的转换。3.2 EXT2文件系统简介Linux第一版的文件系统来自Minix,随着Linux的逐步成熟,从而为Linux量身定做了EXT文件系统,但其性能差强人意,并不能满足实际的需要。1993年由Remy Card做了进一步改良,EXT演变为EXT2,它同样是建立在文件的数据以数据块为组织单位的前提下。因其高效和强健的特性,成为了Linux内核使用的标准根文件系统。EXT2的英文全称是Second Extrended File System,亦即第二扩展文件系统的意思,它负责管理系统外存
12、上的文件,为操作系统和用户提供对文件的存取、共享和保护的手段。Ext2的优点是:l 支持达 4 TB 的内存。 l 文件名称最长可以到 1012 个字符。 l 当创建文件系统时,管理员可以选择逻辑块的大小(通常大小可选择 1024、2048 和 4096 字节)。 l 实现快速符号链接:不需要为此目的而分配数据块,并且将目标名称直接存储在索引节点(inode)表中。这使性能有所提高,特别是在速度上。因为 Ext2 文件系统的稳定性、可靠性和健壮性,所以几乎在所有基于 Linux 的系统(包括台式机、服务器和工作站 并且甚至一些嵌入式设备)上都使用 Ext2 文件系统。然而,当在嵌入式设备中使用
13、 Ext2fs 时,它有一些缺点:Ext2是为象 IDE 设备那样的块设备设计的,这些设备的逻辑块大小是 512 字节,1 K 字节等这样的倍数。这不太适合于扇区大小因设备不同而不同的闪存设备。Ext2 文件系统没有提供对基于扇区的擦除写操作的良好管理。在 Ext2中,为了在一个扇区中擦除单个字节,必须将整个扇区复制到 RAM,然后擦除,然后重写入。考虑到闪存设备具有有限的擦除寿命(大约能进行 100,000 次擦除),在此之后就不能使用它们,所以这不是一个特别好的方法。在出现电源故障时,Ext2fs 不是防崩溃的。Ext2 文件系统不支持损耗平衡,因此缩短了扇区闪存的寿命。(损耗平衡确保将地
14、址范围的不同区域轮流用于写和或擦除操作以延长闪存设备的寿命。)Ext2fs 没有特别完美的扇区管理,这使设计块驱动程序十分困难。EXT2把硬盘分成多个分区,通常必须有一个主分区(Native)和一个交换分区(Swap),Linux把每一个分区都当作一个独立的设备对待。主分区的大部分空间用来存储系统中的各种数据,例如普通文件、目录文件等文件,少部分用来定义文件系统的数据结构;交换分区用作系统的虚拟内存。实际上每个分区都是一个文件系统,有它们各自的顶层目录和下面的目录层次结构。这些单独的文件系统按照一定的挂接方式形成一个总的目录层次结构。逻辑分区继续分成多个块组(block group) ,块组下
15、面又分为超级块(SuperBlock)、组描述符表(group descriptors)、块位图(Bitmap)、索引节点(inode)位图、索引节点表、目录块和数据块等,它们各自占有不同数量的逻辑块,在文件系统中起着不同的作用。在块组0之前还有一个引导块,它位于任何EXT2分区中的第1块,是为分区的启动扇区保留的,不受Ext2 文件系统的管理。若该分区为系统的主引导分区时,引导块的内容就为引导信息含有可执行代码,否则为空。在同一个文件系统中,数据块的大小是固定的,对于不同的EXT2 文件系统这个值可以不同。数据块的大小是在建立EXT2文件系统时,由系统管理员指定或由文件系统的创建程序根据硬盘
16、分区的大小,自动选择一个较合理的值确定的,这个值一经确定,文件系统就把它作为基本参数保存起来,在运行期间就不会改动了。以后文件所需的存储空间就依照这个指定大小的数据块为基本单位进行分配。EXT2文件系统的逻辑硬盘布局在每个块组中重复保存着相对于其分区文件系统的一些重要信息,包括一份超级块的拷贝和一组块组描述符的拷贝。这种对文件系统完整性关键信息的重复保存,虽然浪费了一些存储空间,但有助于文件系统在发生故障时的还原。实际上只有块组0 中所包含的超级块和组描述符才被内核读取使用,其余的拷贝信息一般保持不变,只有当出现数据损坏,并且块组0中的主超级块和主描述符表变为无效时,才被文件系统引用,通过e2
17、fsck 程序把Ext2 分区恢复到某个一致的状态。四、数据设计与表示4.1 头文件说明4.1.1 头文件:types.h#ifndef _I386_TYPES_H#define _I386_TYPES_H#define VARTYPE 1 /1为在vc下编译#if VARTYPE=1typedef unsigned int _U32; typedef unsigned short _U16;typedef unsigned char _U8;typedef int _S32; typedef short _S16;typedef char _S8;#elsetypedef unsigned
18、long _U32;typedef unsigned int _U16;typedef unsigned char _U8;typedef long _S32;typedef int _S16;typedef char _S8;#endif#endif因为在16位和32位的编译器下表达int的字节是不同的,而在写各种数据块时又必须按照字节对应写入,这就照成了程序的不能通用。鉴于此,我们使用typedef命令把数据类型进行了规定。4.1.2头文件:filetype.h#ifndef _FILETYPE_#define _FILETYPE_#define UKN0x0000 /0 未知#defin
19、e REG0x0001 /1 普通文件#define DIR0x0002 /2 目录文件#define CHR0x0003 /3 字符设备#define BLK0x0004 /4 块设备#define FIFO 0x0005 /5 命名管道#define SOCK 0x0006 /6 套接字#define LNK0x0007 /7 符号链接#defineS_IREG(flag)(flag=0x01)?REG:0/1 判断普通文件#defineS_IDIR(flag)(flag=0x02)?DIR:0/2 判断目录文件#defineS_ICHR(flag)(flag=0x03)?CHR:0/3
20、判断字符设备#defineS_IBLK(flag)(flag=0x04)?BLK:0/4 判断块设备#defineS_IFIFO(flag)(flag=0x05)?FIFO:0/5 判断命名管道#defineS_ISOCK(flag)(flag=0x06)?SOCK:0/6 判断套接字#defineS_ILNK(flag)(flag=0x07)?LNK:0/7 判断符号链接#endif按照UNIX的文件属性设置定义该头文件,及用来对文件属性的判断。4.1.3头文件:sys.h该头文件包括了系统使用的各种宏定义和数据结构,这部分的内容将在“数据结构说明”和“宏定义说明”部分予以介绍。4.2数据结
21、构说明4.2.1 超级块(super block)超级块位于每个块组的最前面,如前所述对于每个块组其内容是相同的,在任何一个块组中超级块只占用1个数据块。它是用来描述EXT2文件系统整体布局信息的数据结构,包含其所在分区文件系统目录和文件的静态分布情况,并给出文件系统各组成部分的大小和形状等信息。struct ext2_super_block _U32s_inodes_count; /* 索引节点的总数 Inodes count */_U32s_blocks_count; /* 以块为单位的文件系统的大小 Blocks count */_U32s_free_blocks_count; /* 空
22、闲块计数器 Free blocks count */_U32s_free_inodes_count; /* 空闲索引节点计数器 Free inodes count */_U32s_first_data_block; /* 第一个使用的块号 First Data Block */_U32s_log_block_size; /* 块的大小 Block size */_U32s_blocks_per_group; /* 每组中的块数 Blocks per group */_U32s_inodes_per_group; /* 每组中的节点数 Inodes per group */_U32s_mtime
23、; /* 最后一次安装操作的时间 Mount time */_U32s_wtime; /* 最后一次写操作的时间 Write time */_U16s_magic; /* 魔数签名 Magic signature */_U32s_first_ino; /* 第一个非保留的索引节点号 */_U16 s_inode_size; /* 磁盘上索引节点结构的大小 */;#define SUPER_BLOCK_LEN sizeof(struct ext2_super_block) /56B4.2.2 组描述符在设计上Linux深受BSD FFS(快速文件系统)的影响,它的块组与 FFS的柱面组很类似。然
24、而,块组与磁盘上块的物理布局没有关系,因为现代驱动器趋向于顺序访问优化设计,并向操作系统隐藏了其中的物理几何参数。这个结构也同样在性能上带来好处:通过减少i节点表与数据块之间的距离,就有可能降低磁头对文件I/O操作寻道的时间,从而提高了文件存取的效率。分区在逻辑上把块组看作是一个线性数组,所含块组的数量取决于该分区的大小和预设的块的大小,主要限制在于块位图。每个块组中的块位图必须存放在1个单独的块中,用来标识一个组中块的占用和空闲状况。在数据块的大小确定以后,每个块组的大小也同时被固定了下来,由下面的公式可以得到一组重要的信息:设数据块及分区容量分别为: N KB S KB每组中含数据块的最大
25、数: DBMAX=N*1024*8=8192*N块组最大容量: BGSIZE=DBMAX*N=8192*N2分区中块组最小数: BGMIN=S/DBSIZE=S/(8192* N2)每个块组与一个组描述符(ext2_group_desc,见includelinuxext2_fs.h)对应,组描述符记录该块组的一些重要信息的位置以及该块组的空间使用情况,struct ext2_group_desc_U32bg_block_bitmap; /* 块位图的块号 */_U32 bg_inode_bitmap; /* 索引节点位图的块号 */_U32 bg_inode_table; /* 第一个索引节点
26、表块的块号 */_U16 bg_free_blocks_count; /* 组中空闲块的个数 */_U16 bg_free_inodes_count; /* 组中索引节点的个数 */_U16 bg_used_dirs_count; /* 组中目录的个数 */_U16 bg_id; /* 该组描述副的编号 */_U32bg_reserved3; /* 填充字符 */;#define GROUP_DESC_LEN sizeof(struct ext2_group_desc) /32B4.2.3 磁盘索引节点struct ext2_inode_U16 i_mode; /* 文件类型和访问权限 */_
27、U16 i_uid; /* 拥有者标识符 */_U32 i_size; /* 以字节为单位的文件长度 */_U32 i_atime; /* 最后一次访问文件的时间 */_U32 i_ctime; /* 索引节点最后改变的时间 */_U32 i_mtime; /* 文件内容最后改变的时间 */_U32 i_dtime; /* 文件删除的时间 */_U16 i_gid; /* 组标识符 */_U16 i_links_count; /* 硬链接计数器 */ _U32 i_blocks; /* 文件的数据块数 */_U32 i_flags; /* 文件标志 */ _U32 i_blockEXT2_N_
28、BLOCKS; /* 指向数据块的指针 */_U32 re2;#define INODE_LEN sizeof(struct ext2_inode) /644.2.4 内存索引节点struct ext2_inode_info struct ext2_inode_info *i_next;struct ext2_inode_info *i_pri;_U16i_mode; /* 文件类型和访问权限 */_U32i_dataEXT2_N_BLOCKS; /* 逻辑块指针 */_U32i_count; /* 内存关联文件数 */_U32i_inode; /* 索引接点编号 */_U8i_dirty;
29、/* 脏数据 */_U32i_links_count; /* 硬链接计数器 */ _U16i_blocks; /* 文件大小(以块表示) */_U32i_size; /* 以字节为单位的文件长度 */_U16 i_uid; /* 拥有者标识符 */_U32i_atime; /* 最后一次访问文件的时间 */_U32i_ctime; /* 索引节点最后改变的时间 */_U32i_mtime; /* 文件内容最后改变的时间 */_U32i_dtime; /* 文件删除的时间 */;#define INODE_INFO_LEN sizeof(struct ext2_inode_info)4.2.5磁
30、盘目录项结构体在ext2文件系统中,目录文件包含有下属文件与子目录的登记项。当创建一个文件时,就构成一个目录项,并添加到相应的目录文件中。一个目录文件可以包含很多目录项,每个目录项(如ext2文件系统的ext2_dir_entry_2)包含的信息如下:(1)索引节点号。这是相应文件在数据块组中的索引节点号码,即检索索引节点表数组的索引值。(2)目录项长度。记载该目录项占多少字节。(3)名字长度。记载相应文件名的字节数。(4)文件类型。用一个数字表示文件的类型,例如,1表示普通文件,2表示目录,3表示字符设备文件,4表示块设备文件等。(5)文件名字。文件名(不包括路径部分)的最大长度为255个字
31、符。每个目录的前两个目录始终是标准的“.”和“.”,它们分别代表目录自身和其父目录。当用户需要打开某个文件时,首先要指定该文件的路径和名称,文件系统根据路径和名称搜索对应的索引节点,找到该文件的数据块,从而读取文件中的数据。struct ext2_dir_entry _U32inode; /* 索引节点号 Inode number*/_U16 rec_len; /* 目录项的长度 Directory entry length */ _U16 file_type; /* 文件类型 */charnameEXT2_NAME_LEN; /* 文件名 File name length*/;#define
32、 DIR_ENTRY_LEN sizeof(struct ext2_dir_entry) /64B4.2.6当前目录结构体struct fs_struct _U32 count;_U32 lock;_U32 umask;struct ext2_inode_info * root, * pwd;char d_pwdEXT2_NAME_LEN,d_rootEXT2_NAME_LEN;#define FS_STRUCT_LEN sizeof(struct fs_struct)4.2.7用户打开文件表结构体struct files_struct _U32 count;_U32 file_lock;/*
33、 Protects all the below members. Nests inside tsk-alloc_lock */_S32 max_fds;_S32 max_fdset;_S32 next_fd;struct file * fd;/* current fd array */struct file * fd_arrayNR_OPEN_DEFAULT;#define FILES_STRUCT_LEN sizeof(struct files_struct)4.2.8系统打开文件表结构体struct file struct file * f_next;struct dentry* f_de
34、ntry; /* 所在目录 */_U32f_count; /* 连接计数器 */_U32 f_flags;_U16f_mode;_U32f_pos; /* 文件位移 */_U32f_uid, f_gid;_U32f_maxcount;#define FILE_STRUCT sizeof(struct file)4.2.9用户结构体#define USER_NAME_LENGTH 10#define PSDMAX 10#define PATH 40struct user_struct _U16 u_uid;_U16 u_gid;char u_nameUSER_NAME_LENGTH;char u
35、_psdPSDMAX;char u_pathPATH;#define USER_STRUCT_LEN sizeof(struct user_struct) /32B4.3 宏定义说明#define EXT2_SUPER_MAGIC0xEF53#define VDISKSIZE_MB 16 /* 表示磁盘为多少M */#define BLOCKSIZE_BT 512 /* 磁盘块的大小 (512字节) */#define RDISKSIZE_MB(VDISKSIZE_MB-VDISKSIZE_MB%GROUPSIZE_MB)#define RDISKSIZE_BT(RDISKSIZE_MB*10
36、24*1024)#define GROUPSIZE_BK (BLOCKSIZE_BT*8) /* 组容量:以逻辑块个数表示 */#define GROUPSIZE_BT (GROUPSIZE_BK*BLOCKSIZE_BT) /* 组容量:以字节表示 */#define GROUPSIZE_MB (GROUPSIZE_BT/1024/1024) /* 组容量:以M表示 */#define GROUPNUM_FS(RDISKSIZE_MB/GROUPSIZE_MB) /* 文件系统组的总数 */#define GROUPDESCNUM_PBLK(BLOCKSIZE_BT/GROUP_DESC_L
37、EN) /* 每个逻辑块含组描述符的个数 */#define GROUPDESCNUM_BK(GROUPNUM_FS/GROUPDESCNUM_PBLK) /* 组描述符占的数据块数 */#if VDISKSIZE_MB32#define GROUPDESCNUM_BK 1#endif#define DINODENUM_PGUP(BLOCKSIZE_BT*8)/* 每组含索引节点的个数 */#define DINODENUM_PBLK(BLOCKSIZE_BT/INODE_LEN)/* 每个逻辑块含索引节点的个数 */#define DINODETBL_PGUP(DINODENUM_PGUP/DINODENUM_PBLK) /* 索引节点表占的块数 */#define DINODENUM_FS(DINODENUM_PGUP*GROUPNUM_FS) /* 索引节点总数 */#define FREEBLKNUM_PGUP(GROUPDESCNUM_BK-4-DINODETBL_PGUP) /* 每组空闲块数 */#define FRISTDATA(4+GROUPDESCNUM_BK+DINODETBL_PGUP)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大学国防安全教育
- 压疮的预防和护理措施
- 汽车配件行业年度工作总结
- 2025年中国泵室市场调查研究报告
- 2025年中国室温固化耐高温环氧胶市场调查研究报告
- 2025年中国土地承包管理系统市场调查研究报告
- 2025年中国压克力吊灯配件市场调查研究报告
- DB3301T 0477.2-2024杭帮菜 第2部分:东坡肉
- 监理费合同补充协议
- 离婚卖房分割财产合同协议
- 母乳喂养知识培训课件下载
- 西安市曲江第三中学行政人员及教师招聘笔试真题2024
- 2025-2030中国竹纤维行业市场发展现状及竞争策略与投资前景研究报告
- 委托外包催收合同协议
- 2025-2030中国涂装行业市场深度分析及发展预测与投资策略研究报告
- 乳腺癌诊治指南与规范(2025年版)解读
- 银行系统招聘考试(经济、金融、会计)模拟试卷14
- 心理韧性在咨询中的重要性试题及答案
- 外研版(三起)(2024)三年级下册英语Unit 2 单元测试卷(含答案)
- 2025年全国普通话水平测试训练题库及答案
- 2025年山东省滨州市阳信县九年级一模模拟化学试题(含答案)
评论
0/150
提交评论