发明内容
有鉴于此,本发明提供了一种实现共享文件的方法、服务器及系统,以克服现有技术中对分散的共享文件进行共享时,容易消耗系统功耗,并且不能较快速和准确完成文件共享的问题。
为实现上述目的,本发明提供如下技术方案:
一种实现共享文件的方法,包括:
在预设虚拟磁盘中创建采用32位的文件分配表FAT32分区;
依据所述FAT32的文件列表格式,在所述虚拟磁盘中创建虚拟文件列表、虚拟文件及虚拟文件,使所述虚拟文件及虚拟文件与真实磁盘中需共享的真实文件夹以及文件一一对应;
设置所述虚拟磁盘为samba共享;
接收获取共享文件的请求,解析获取所述请求中包含的数据段在所述虚拟磁盘中的起始扇区号和读取的扇区个数;
依据所述起始扇号进行查找共享文件所在扇区,并依据读取的扇区个数连续进行读取,获取共享文件路径、共享文件名、共享文件偏移量和请求的数据长度;
依据所述共享文件路径、共享文件名、共享文件偏移量和请求的数据长度获取共享文件;
发送所述共享文件,实现文件共享。
优选的,所述虚拟磁盘中的虚拟文件与真实磁盘中一一对应的真实文件的大小相同。
优选的,所述虚拟磁盘中的虚拟文件的名称和路径与真实磁盘中一一对应的真实文件的名称和路径不一致。
优选的,所述虚拟磁盘中的虚拟文件的名称和路径与真实磁盘中一一对应的真实文件的名称和路径一致。
优选的,所述虚拟磁盘中创建虚拟文件及虚拟文件的过程为:在创建虚拟文件夹的基础上连续创建与真实磁盘中的真实文件一一对应的虚拟文件。
优选的,每个文件的所述起始扇区号为上一文件的起始扇区与存储所述上一文件所占扇区之和。
一种实现共享文件的服务器,包括:
创建单元,用于预设虚拟磁盘,在虚拟磁盘中创建FAT32分区,并依据FAT32的文件列表格式,在所述虚拟磁盘中创建虚拟文件列表、虚拟文件夹以及虚拟文件;
映射单元,用于使所述虚拟磁盘中的虚拟文件夹以及虚拟文件与真实磁盘中需共享的真实文件夹以及文件进行一一对应;
设置单元,用于设置所述虚拟磁盘为samba共享;
文件系统,用于接收客户端获取共享文件的请求,解析获取所述请求中包含的数据段在所述虚拟磁盘中的起始扇号和读取的扇区个数,依据所述起始扇号进行查找共享文件所在扇区,并依据读取的扇区个数连续进行读取,获取共享文件路径、共享文件名、共享文件偏移量和请求的数据长度;
发送单元,用于依据所述共享文件路径、共享文件名、共享文件偏移量和请求的数据长度获取共享文件,并将所述共享文件发送至客户端。
优选的,所述文件系统中包括:
接收单元,用于接收客户端获取共享文件的请求;
解析单元,用于解析所述请求中包含的数据段在所述虚拟磁盘中的起始扇号和读取的扇区个数,确定共享文件所在扇区,并按照可读取的扇区个数连续进行读取,获取共享文件路径、共享文件名、共享文件偏移量和请求的数据长度。
一种实现共享文件的系统,包括:上述的服务器和客户端;
所述服务器,用于预设虚拟磁盘,并在虚拟磁盘中创建与真实磁盘中需共享的真是文件一一对应的虚拟文件,以及接收所述客户端发送的获取共享文件的请求并进行解析,将依据解析结果获取到的共享文件发送给所述客户端;
所述客户端,用于向所述服务器发送获取共享文件的请求,以及接收服务器反馈的共享文件信息。
经由上述的技术方案可知,与现有技术相比,本发明公开了一种实现共享文件的方法、服务器及系统,通过将分散的文件组织在同一个虚拟磁盘中,然后通过一次操作来添加samba共享,使客户端看到的共享资源是一个磁盘分区,并利用服务器通过文件列表控制客户端看到的文件,控制虚拟磁盘中的文件和文件夹,以及虚拟文件和真实文件对应关系,从而组织客户端的文件和文件夹结构,控制客户端能够读取的文件。因此,通过本发明公开的方法、服务器以及系统可以实现低功耗、快速和准确的获取共享文件。
具体实施方式
为了引用和清楚起见,下文以及附图中使用的技术名词的说明、简写或缩写总结如下:
SMB:Server Message Block,是协议名,它能被用于连接客户端与服务器之间的信息沟通;
FAT:File Allocation Table,文件配置表,FAT32是Windows操作系统硬盘分区格式的一种,这种格式采用32位的文件分配表;
Virtual Disk:虚拟磁盘分区;File list on Virtual Disk:位于虚拟磁盘分区上的文件列表;File list on server disk:位于实际磁盘分区上的文件列表;
Physical Disk:真实磁盘;File System:文件系统;Network:网络;
DBR:Dos Boot Record,DOS引导记录;
BPB:BIOS Parameter Block,作为逻辑盘的描述区域,包含隐藏扇区数目(从0-1-1开始计算)、FAT扇区数、FAT拷贝数、硬盘磁头总数、根目录表项最大值等;在FAT32的每个表项由4字节(32位)组成,通常每个表项指向的簇包含8个扇区,即4K字节,逻辑盘容量最小为512MB。
簇:扇区是磁盘最小的物理存储单元,但由于操作系统无法对数目众多的扇区进行寻址,所以操作系统就将相邻的扇区组合在一起,形成一个簇,然后再对簇进行管理;
FDT:File Directory Table,文件目录表,紧跟在FAT2的下一个扇区,长度为32个扇区;
Client:客户端;Server:服务器;
File:文件;Calculation:计算、运算。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
针对现有技术中在进行共享文件时,对分散的共享文件执行设置共享属性的操作,或者将需要共享的文件或不需要共享的文件进行拷贝操作,是共享的文件处于同一文件夹内,以便于正常进行共享,但是,采用上述方式在消耗一定的系统功耗的基础上并不能快速、准确的完成对需要共享的文件进行共享。
因此,本发明公开了一种实现共享文件的方法、服务器及系统,提出一种新的共享文件的执行过程:首先,根据服务器和客户端的需求生成要共享的文件列表,然后,根据列表创建一个虚拟磁盘分区(VirtualDisk)。并且,这个虚拟磁盘分区不占有实际的存储空间,但其基本属性与物理意义上的磁盘分区一致。在该虚拟磁盘分区中对应有所有要共享的文件名,然后,服务器把这个虚拟磁盘分区通过samba协议添加共享。当客户端从这个虚拟磁盘中读取数据时,计算这段数据在服务器中的实际存储路径,通过网络读取并返回给用户程序。具体的过程通过以下实施例进行详细说明。
请参阅附图1,为本发明实施例公开的一种实现共享文件的方法流程图,请参阅附图2,为该方法的原理示意图,该方法主要包括以下步骤:
步骤S101,服务器向系统发送注册信息,预设虚拟磁盘。
步骤S102,服务器在所述虚拟磁盘中创建一个空的FAT32分区。
步骤S103,服务器依据FAT32的文件列表格式,在虚拟磁盘中创建虚拟文件列表、虚拟文件夹以及虚拟文件,并使虚拟文件夹以及虚拟文件与真实磁盘中需共享的真实文件夹以及文件一一对应。
步骤S104,设置所述虚拟磁盘为samba共享。
步骤S105,服务器接收客户端获取共享文件的请求,并进行解析获取所述请求中包含的数据段在所述虚拟磁盘中的偏移量,即起始扇区号,以及可读取的扇区个数。
步骤S106,服务器依据所述起始扇号进行查找,确定共享文件所在扇区,并按照可读取的扇区个数连续进行读取,获取共享文件路径、共享文件名、共享文件偏移量和请求的数据长度。
步骤S107,服务器依据所述共享文件路径、共享文件名、共享文件偏移量和请求的数据长度获取共享文件,并将所述共享文件发送至客户端,实现文件共享。
下面对上述步骤进行详细说明:
在执行步骤S101中,预设虚拟磁盘实际上是向系统注册一个虚拟的磁盘分区,并且这个分区没有设备符号,也没有实际的存储空间。
在步骤S102和步骤S103中提到的FAT32是Windows操作系统硬盘分区格式的一种,FAT32文件系统是微软制定的一个文件系统标准,最早出现在Windows95 R2版本中。如图3所示,FAT32文件系统的基本结构主要由以下三部分组成:
1、DBR:包括跳转指令、厂商标志、OS版本号、BPB、扩展BPB、引导程序和结束符;
2、FAT表:实际数据存储空间的映射表,FAT1和FAT2完全一致,后者作为前者的备份,实际应用中基本用不到;
3、FAT32文件系统把根目录也当作一个特殊的文件来处理,起始簇号是2。
FAT32针对文件的管理,除了根目录,FAT32文件系统中的所有文件(子目录作为一种特殊的文件)都对应一组数据结构,保存在文件描述符中,包含了这个文件的所有属性。每个目录内的所有文件和子目录的文件描述符都存储在这个目录对应的存储空间内,每一个文件描述符项有32个字节,主要包括文件名、文件属性、文件大小、文件存储位置以及一系列的时间描述结构等。因此,把文件路径、文件描述符、FAT表联系在一起就可以完全把握一个文件在硬盘的存储情况,并且一般情况下可以通过下面的步骤定位文件的所有内容,请参阅附图4,主要包括以下步骤:
步骤S201,通过路径找到文件目录所在的簇。
步骤S202,在目录对应的空间内比对文件名,找到文件对应的文件描述符项。
步骤S203,通过文件描述符项确定文件的起始簇和文件大小。
步骤S204,根据FAT表内的簇链确定文件的存储位置。
需要说明的是,在执行步骤S103时,创建的虚拟文件列表中包括文件全路径和文件大小,示例如表1所示。
需要说明的是,虚拟磁盘中的虚拟文件与真实磁盘中的真实文件一一对应,而且对应的虚拟文件与真实文件的大小也是相同的。但是,虚拟文件和真实文件的名称和路径可以不一样,只要两者一一对应即可,其名称和路径并不影响两者之间的对应关系,因此服务器可以按照客户端的要求任意组织文件。例如,在下表1中虚拟磁盘中的“V:/文件夹1/文件1”对应于实际磁盘中的文件“C:/Path1/File_01”,他们的大小相同,当用户程序读取“V:/文件夹1/文件1”,实际读到的数据应该是文件“C:/Path1/File_01”相同偏移量的数据。
表1:
而在执行步骤S103在所述虚拟文件列表的基础上依次创建、存储与真实磁盘中需共享的文件一一对应的虚拟文件夹、虚拟文件的过程,可以按照上述文件列表创建虚拟文件,创建时先创建所有虚拟文件夹,然后创建普通文件,也就是在所述虚拟文件夹的基础上连续的创建对应共享文件的虚拟文件,保证所有创建的虚拟文件,即普通文件在虚拟磁盘存储空间中是连续的,并且排列顺序同附图5中一样,即文件存储结构示例如附图5所示。
在执行步骤S103中为保证虚拟文件与真实文件的一一对应,需要在虚拟磁盘中定义结构体(File_Info),该结构体用来描述每个文件在虚拟磁盘中存储的起始扇区号(Start_Sector)、文件大小(File_Size)、虚拟文件名(File_Name_V)和实际的文件名(File_Name_T)。每个文件对应一个结构体,组成一个结构体数组File_Info[]。该结构体数据组的生成方式举例进行说明,即可通过表1中文件列表形式生成。
第一个文件的起始扇区号(Start_Sector_0)是FAT32文件系统的第一个普通文件存储位置,位于数据区中紧邻目录之后的位置。Start_Sector_0可以通过查找FDT表得到,也可以在创建虚拟磁盘文件时保存下来。
扇区大小Sector_Size可以从FAT32分区的第一个扇区中读出,设为Sector_Size,通常为固定的512字节。关于扇区的大小可以通过以下过程进行计算:每个文件的起始扇区号Start_Sector_N(N>=1)等于上一文件的起始扇区加上存储上一文件所占扇区。上述过程利用公式(1)可以表示为:
Start_Sector_N=Start_Sector_(N-1)+(File_Size_(N-1)+Sector_Size-1)%512 (1)
通过上述计算可以得到的文件信息的结构体数组File_Info[]内容,如表3所示。
表3:
序号 |
File_Size |
Start_Sector |
File_Name_V |
File_Name_T |
0 |
100000 |
18366 |
/文件夹1/文件1 |
C:/Path1/File_01 |
1 |
200000 |
18562 |
/文件夹2/文件2 |
E:/Path3/File_02 |
2 |
300000 |
18953 |
/文件夹2/文件3 |
F:/Path4/File_03 |
3 |
400000 |
19539 |
/文件夹2/文件4 |
D:/Path2/File_04 |
由于,在日常使用的操作系统中,应用层程序通过文件系统读取一个磁盘分区中的数据时,需要知道的参数为:
A、文件路径(File_Path)。
B、文件名(File_Name)。
C、该段数据在该文件中的偏移量(File_Offset)。
D、请求的数据长度(File_Size)。
然后再通过文件系统层的计算,找到每段数据在磁盘中的实际存储位置,即:
E、该段数据在磁盘中的偏移量,即起始扇区号(Offset_In_Sector)。
F、可读取的扇区个数(Size_In_Sector)。
在执行步骤S105时,请参阅附图6,为客户端请求读取数据的原理示意图,基于上述读取一个磁盘分区中的数据所需的参数内容,当客户端通过samba协议读取这个共享虚拟磁盘中的文件数据时,采用逆向进行解析。服务器的文件系统层接收请求中携带的参数,这些参数包括请求中包含的数据段在虚拟磁盘中的起始扇区号,以及要读取的扇区个数,也就是上文中提到的参数E和F,而服务器的文件系统要解析出的参数则是上文中提到的参数A、B、C和D,最后,该文件系统可以以A、B、C、D为参数,请求虚拟磁盘文件对应的数据。
步骤S106和步骤S107即为逆向解析过程,以获取共享的实际文件。具体的逆向解析过程下面以图6、图7和表1、表3中的内容举例进行说明:
在依据Samba协议的客户端的请求到达服务器以后,经服务器的文件系统解析,传到服务器块设备层的请求结构为上述的参数E和F,即Offset_In_Sector和Size_In_Sector。
例如,块设备收到的请求是:Offset_In_Sector=18969,Size_In_Sector=8,即表示文件系统希望块设备从18969扇区开始,连续读取8个扇区的数据,并将读取到的数据返回给文件系统。
因为在本发明实施例中文件是连续存储的,所以也可以用简单的折半查找法查找这个扇区对应的文件,查找复杂度为O(log(n+1)),n是以零起始的文件个数(N=n+1)。
从表3中看以看出,18969号扇区位于第三个文件中,解析出的信息为:
A、文件路径(File_Path): /文件夹2/;
B、文件名(File_Name): 文件3;
C、文件偏移量(File_Offset): (18969-18953)*Sector_Size;
D、请求的数据长度(File_Size): 8*Sector_Size;
因此,由上述逆向解析之后的信息可知,请求的文件在虚拟盘符中的文件名是“/文件夹2/文件3”,根据表1或者表3中的文件信息,可以查到实际文件是“F:/Path4/File_03”。到此,即完成了虚拟磁盘偏移到文件名和文件偏移的逆向解析,设备驱动可以根据以上参数从服务器中获取实际的共享文件,在将获取到的共享文件发送至至客户端,实现文件共享。图6为客户端进行请求的原理示意图;图7为通过虚拟磁盘读取实际磁盘文件的原理示意图。
综上所述,本发明基于该FAT32文件系统的上述技术特征,根据文件列表,创建虚拟磁盘,将分散的文件组织在同一个虚拟磁盘中,然后通过一次操作来添加samba共享的整体方法。在实现文件共享的时候,不需要浪费系统功耗的分别设置每个文件夹的共享属性。
在执行本发明实施例所公开的方法时,服务器共享的是一个整体的磁盘分区,而客户端看到的共享资源是一个磁盘分区,与现有技术中常规的samba共享时,服务器共享分散的文件夹,客户端看到的也是分散的文件夹不同。
同时,服务器通过文件列表控制客户端看到的文件,还可以通过修改文件列表,方便的控制虚拟磁盘中的文件和文件夹,以及虚拟文件和真实文件对应关系,从而组织客户端的文件和文件夹结构,控制客户端能够读取的文件。因此,采用本发明实施例所公开的方法可以实现低功耗、快速和准确的获取共享文件的过程。
上述本发明公开的实施例中详细描述了一种实现共享文件的方法,对于本发明的方法可采用多种形式的装置实现,因此本发明还公开了一种实现共享文件的服务器,下面给出具体的实施例进行详细说明。
请参阅附图7所示,本发明实施例中公开的一种实现共享文件的服务器的结构示意图,主要包括:创建单元101、映射单元102、设置单元103、文件系统104和发送单元105。
创建单元101,用于预设虚拟磁盘,在虚拟磁盘中创建一个空的FAT32分区,并依据FAT32的文件列表格式,在所述虚拟磁盘中创建虚拟文件列表、虚拟文件夹以及虚拟文件。
在创建单元101中的预设虚拟磁盘即没有设备符号,也没有实际的存储空间。在虚拟磁盘中创建了一个空的FAT32分区,该FAT32的文件列表格式如图3所示。
映射单元102,用于使所述虚拟磁盘中的虚拟文件夹以及虚拟文件与真实磁盘中需共享的真实文件夹以及文件进行一一对应。
需要说明的是,虚拟磁盘中的虚拟文件与真实磁盘中的真实文件一一对应,而且对应的虚拟文件与真实文件的大小也是相同的。但是,虚拟文件和真实文件的名称和路径可以不一样,服务器可以按照客户端的要求任意组织文件。
设置单元103,用于设置所述虚拟磁盘为samba共享。
文件系统104,用于接收客户端获取共享文件的请求,并进行解析获取所述请求中包含的数据段在所述虚拟磁盘中的起始扇号和可读取的扇区个数,确定共享文件所在扇区,并按照可读取的扇区个数连续进行读取,获取共享文件路径、共享文件名、共享文件偏移量和请求的数据长度。
发送单元105,用于依据所述共享文件路径、共享文件名、共享文件偏移量和请求的数据长度获取共享文件,并将所述共享文件发送至客户端。
在本发明实施例所描述的服务器的基础上,该文件系统104中包括:接收单元1041和解析单元1042。
接收单元1041,用于接收客户端获取共享文件的请求。
解析单元1042,用于解析所述请求中包含的数据段在所述虚拟磁盘中的起始扇号和可读取的扇区个数,确定共享文件所在扇区,并按照可读取的扇区个数连续进行读取,获取共享文件路径、共享文件名、共享文件偏移量和请求的数据长度。
在进行文件系统104进行解析的过程中,依据上述本发明所公开的方法实施例中的逆向解析的方法进行解析,依据收到的起始扇号和可读取的扇区个数获得共享文件路径、共享文件名、共享文件偏移量和请求的数据长度,使该服务器可以依据上述获取到的与共享文件相关的内容,在设置为samba共享的虚拟磁盘中查找到虚拟文件对应的真实文件,从而实现文件的共享。
上述本发明公开的实施例中详细描述了一种实现共享文件的方法和装置,对于本发明的方法可采用多种形式的系统实现,因此本发明还公开了一种实现共享文件的系统,下面给出具体的实施例进行详细说明。
请参阅附图8,为本发明实施例公开的一种实现共享文件的系统结构示意图,主要包括:服务器201和客户端202。
服务器201,用于预设虚拟磁盘,并在虚拟磁盘中创建与真实磁盘中需共享的真是文件一一对应的虚拟文件,以及接收客户端202发送的获取共享文件的请求并进行解析,将依据解析结果获取到的共享文件发送给客户端202。
客户端202,用于向服务器201发送获取共享文件的请求,以及接收服务器反馈的共享文件信息。
需要说明的是,上述服务器201与客户端202之间通过网络203进行数据间的交互。
服务器201的结构与上述本发明实施例公开的服务器结构一致,这里不再赘述。通过上述本发明实施例公开的系统,实现根据FAT32文件列表创建虚拟磁盘,将分散的文件组织在同一个虚拟磁盘中,然后通过一次操作来添加samba共享,使客户端看到的共享资源是一个磁盘分区,并利用服务器通过文件列表控制客户端看到的文件,还可以通过修改文件列表,方便的控制虚拟磁盘中的文件和文件夹,以及虚拟文件和真实文件对应关系,从而组织客户端的文件和文件夹结构,控制客户端能够读取的文件。因此,采用本发明实施例所公开的系统可以实现低功耗、快速和准确的获取共享文件。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。