首页> 中国专利> 一种解析FAT文件系统的文件名的方法

一种解析FAT文件系统的文件名的方法

摘要

本发明提供了一种解析FAT文件系统的文件名的方法,读取并保存所述FAT文件系统中的长文件名文件的长文件名,不保存长文件名文件的别名;读取并保存短文件名文件的短文件名;截取长文件名的一部分作为解析后的文件名;将短文件名的编码转换为UNICODE编码。本发明提供的解析FAT文件系统的文件名的方法,大大减少了系统资源,尤其是存储空间的开销,适用于资源有限,尤其是存储空闲较小的系统。

著录项

  • 公开/公告号CN102567325A

    专利类型发明专利

  • 公开/公告日2012-07-11

    原文格式PDF

  • 申请/专利权人 无锡华润矽科微电子有限公司;

    申请/专利号CN201010587523.2

  • 发明设计人 蒋虎;张立新;褚剑波;

    申请日2010-12-14

  • 分类号G06F17/30;

  • 代理机构上海智信专利代理有限公司;

  • 代理人王洁

  • 地址 214061 江苏省无锡市梁溪路14号

  • 入库时间 2023-12-18 05:55:46

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2013-11-27

    授权

    授权

  • 2012-09-19

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20101214

    实质审查的生效

  • 2012-07-11

    公开

    公开

说明书

技术领域

本发明涉及FAT(File Allocation Table,文件分配表)系统,具体涉 及文件分配表系统中文件名的解析方法。

背景技术

目前,FAT文件系统正被广泛应用于管理磁盘数据空间。为满足不同存 储空间范围的空间管理,微软定义了FAT12、FAT16和FAT32三种文件系统。 这三种文件系统的区别在于FAT表中基本单位分别是12bit、16bit和32bit。 FAT文件系统使用目录区(directory region)来存储目录下面的文件信息。 大小为32字节的目录项(entry)是目录区中用来组织数据的基本单位,

对于短文件名文件,其文件名的存储基本结构如图1所示。每个短文件 名文件有一个目录项与之相对应,这些目录项中存储着文件名、文件扩展名、 属性、创建时间、创建日期、文件或目录对应的数据区起始簇等信息。从目 录区的目录项的结构可以发现,一个目录项存储的文件名长度是有限制的, 名字最长为8字节,扩展名最多为3字节。短文件名文件的文件名用图1所 示的短目录项来存储,其只有一个短文件名。

对于长文件名文件的文件名,一个目录项无法容纳其中所有的字符。微 软定义了同为32字节大小的长目录项(long directory entry),具体结构 如图2所示。长文件名文件的文件名的存储,包括用来存储长文件名的一个 或多个长目录项(每个长目录项的结构如图2所示)以及一个用来存储由长 文件名生成的短文件名(又称别名)的目录项。因此,长文件名文件的文件 名在存储时由一个长文件名和一个相应的别名构成。长目录项是不能脱离短 目录项而单独存在的,否则无效。图3是一个长文件名文件的文件名的存储 方式。在图3中,一个短目录项和数个连续的长目录项构成了该文件名的目 录链,长目录项总是紧挨着短目录项并存储在该短目录项的前面。如果长文 件名的长度(包括扩展名)小于13个字符,则只需要一个长目录项,否则 需要多个长目录项。这些长目录项从1开始编号,从图3可以知道,长目录 项的序号越小,离短文件名目录项越近,反之则越远。在实际磁盘中是先存 最后一个编号的长目录项,最后存序号为1的长目录项,然后再存相应的短 目录项。借助长目录项,文件名最长可达255个字符。需要指出的是,对于 由汉字构成文件名的文件,即使文件名中只有1个汉字,那么该文件名在存 储时也需要用图3所示的结构存储。

要实现嵌入式系统对带有FAT文件系统存储设备中文件的读取,首先面 对的问题就是要实现对上述长文件名文件的文件名的解析和对短文件名文 件的文件名的解析。最具代表的解析方法当属Cypress公司为SL811H芯片 提供的参考代码中的解析方法。该方法为长文件名文件的文件名和短文件文 件的文件名名分别分配了256个字节和32个字节存储空间,对目录区数据 进行顺序分析,当读到一个有效的长目录项,则计算该长目录项中存储的文 件名的字符在整个文件名中的序号范围,并将该长目录项中存储的文件名存 储到相应的长文件名数组变量中;当读取到一个短文件名,则将该短文件名 存储到相应的短文件名数组中,并将文件序号计数器增1;继续分析下一个 目录项,直到读取到最后一个目录项。

从上面的解析过程,不难看出,该方法存在以下几点不足:

1.上述方法不仅保存了长文件名,同时还将该长文件名对应的短文 件名也保存起来。而在实际嵌入式系统读取文件时,对于长文件名的文件, 人们往往不关心它的短文件名信息。另外上述方法大大增加了系统资源的开 销。

2.上述方法将长文件名完整地读取出来,若文件名过长,则不能在 某些显示范围有限的嵌入式设备(如LCD TV)完全显示。

3.FAT系统中长文件名的长目录项中存储的文件名采用UNICODE编 码,短目录项中存储的别名采用本地编码;无长目录项的短文件名采用ASCII 编码。同时读取长文件名和短文件名需使用三套编码。

发明内容

本发明要解决的技术问题是现有技术在解析FAT文件系统的文件名时, 对系统资源的开销大,应用于嵌入式系统等系统资源有限的系统时遇到困 难。

为解决上述技术问题,本发明提供了一种解析FAT文件系统的文件名的 方法,读取并保存所述FAT文件系统中的长文件名文件的长文件名,不保存 长文件名文件的别名;读取并保存短文件名文件的短文件名。

进一步为了减少系统资源开销,在所述短文件名文件的短文件名所采用 的ASCII编码前加0x00转化为UNICODE编码。

进一步为了减少系统资源开销,截取所述长文件名文件的长文件名的一 部分作为所述长文件名文件的名称。

所述截取所述长文件名文件的长文件名的方法包括如下步骤:

步骤1、顺序读取目录区的目录项;

步骤2、判断当前目录项是否为最后一个目录项,如果是则结束,否则进 入步骤3;

步骤3、跳过无效的目录项;

步骤4、判断当前目录项是长目录项还是短目录项,若当前目录项为长目 录项则进入步骤5,若当前目录项为短目录项则进入步骤6;

步骤5、提供一阈值N,判断当前长目录项的序号M与阈值N之间的关系;

如果M>N,则不保存当前长目录项中存储的文件名字符,转至步骤1读取 下一目录项;如果M≤N,则保存当前长目录项中存储的文件名字符,并 设置目录项标志为长目录项,转至步骤1读取下一目录项;其中M、N为 正整数;

步骤6、包括如下步骤:

A、判断目录项标志是长目录项还是短目录项,若标志为短目录项,则保 存当前短目录项中存储的文件名字符;若标志为长目录项,则不保存当 前短目录项中存储的文件名字符;

B、将目录项标志更新为短目录项,并转至步骤1读取下一目录项。

其中,步骤3跳过无效的目录项采用的方法是判断当前目录项是否为无 效目录项,若是,则转至步骤1读取下一目录项;否则,进入步骤4。判断 当前目录项是否为无效目录项的方法包括:判断当前目录项的第一个字节是 否为0xE5;若是,则当前目录项是为无效目录项;否则,当前目录项不是无 效目录项。

作为一种优选的方式,步骤3还包括跳过存储隐藏文件的文件名的目录 项。所述跳过存储隐藏文件的文件名的目录项包括:判断当前目录项是否为 存储隐藏文件的文件名的目录项,若是,则转至步骤1读取下一目录项;否 则,进入步骤4。判断当前目录项是否为存储隐藏文件的文件名的目录项的 方法包括:判断当前目录项的第12个字节的第2位(bit)是否为1;若是, 则当前目录项存储的是隐藏文件的文件名;否则,当前目录项存储的不是隐 藏文件的文件名。

作为一种优选的方式,步骤3还包括跳过存储卷标的目录项。所述跳过 存储卷标的目录项包括:判断当前目录项是否为存储卷标的目录项,若是, 则转至步骤1读取下一目录项;否则,进入步骤4。判断当前目录项是否为 存储卷标的目录项的方法包括:判断当前目录项的第12个字节的第4位 (bit)是否为1;若是,则当前目录项存储的是卷标;否则,当前目录项存 储的不是卷标。

可选的,步骤4中判断当前目录项是否为长目录项的方法包括将当前目 录项的第12个字节与0x3F进行与操作;若结果为0x0F,则当前目录项为长 目录项:否则,当前目录项不是长目录项。步骤4中判断当前目录项是否为 短目录项的方法为:将当前目录项的第12个字节与0x1A进行与操作,若结 果为0x10或0x00,则当前目录项为短目录项:否则,当前目录项不是短目 录项。

进一步的,如果步骤4中当前目录项的第12个字节与0x1A进行与操作 的结果为0x10,那么读取当前目录项中存储的文件的后缀名,将所述后缀名 转成小写字母或大写字母后与指定的扩展名比较,如果不相等,则转到步骤 1读取下一目录项,否则进入步骤6;如果步骤4中当前目录项的第12个字 节与0x1A进行与操作的结果为0x00,那么进入步骤6。

作为一种优选的方式,步骤5可以替换为步骤5′:提供一阈值P,判断 当前长目录项的序号M与阈值P之间的关系,P、M为正整数;如果M>[P/13]+1, 则不保存当前长目录项中存储的文件名字符;如果M≤[P/13]+1,则执行如 下步骤:

5.1′、顺序读取当前目录项中存储的文件名字符

5.2′、判断当前文件名字符是否为文件名的结尾;如果是,则结束当前目录 项的读取,转至步骤1读取下一目录项;如果不是,则执行如下步骤:若K+13 (M-1)≤P,则保存当前文件名字符;若K+13(M-1)>P,则不保存当前文 件名字符,并则结束当前目录项的读取,转至步骤1读取下一目录项;K为 当前文件名字符在目录项中的序号。

可选的,长目录项的目录项标志为1,短目录项的目录项标志为0。

可选的,步骤2还包括判断读取的文件数量是否超出指定数量;如果超 出则结束,否则进入步骤3。进一步地,设置一文件序号参数,对读取的文 件进行编号;那么步骤2可以读取当前的文件序号,如果当前的文件序号大 于指定值,则结束;如果当前的文件序号小于或等于指定值,则进入步骤3。 步骤6中转至步骤1之前将当前读取到的文件序号增1。

可选的,步骤6中转至步骤1之前保存当前短目录项中除了文件名字符 之外的属性字段。

本发明的技术效果是解析FAT文件系统中文件名时只保存长文件名和短 文件名,而不保存别名,减少了系统资源的开销。本发明进一步将短文件名 转换为长文件名采用的UNICODE编码,进一步减少了系统资源的开销。另外, 解析时截取长文件名的一部分作为该文件名的名称。这样可以进一步减少系 统资源(尤其是存储空间)的开销。

附图说明

图1是FAT文件系统中短目录项的结构示意图;

图2是FAT文件系统中长目录项的结构示意图;

图3是FAT文件系统中长文件名文件的文件名存储结构示意图;

图4是本发明提供的文件名解析方法实施例的流程图。

具体实施方式

为使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明 作进一步的详细描述。

对于系统资源有限,尤其是存储空闲较小的系统在设计时需要特别关注 对系统资源的利用,尽量减小对系统资源的开销。例如嵌入式设备(如LCD TV)读取带FAT文件系统的存储器设备(如USB Mass Storage)中的文件。 读取文件过程中,解析长文件名和短文件名时要尽量减少对系统资源,特别 是存储空间的开销。

由前文可知,长文件名文件的文件名在存储时由一个长文件名和一个相 应的短文件名(又称别名)构成。本发明中将长文件名文件的短文件名称为 别名,而不称之为短文件名;只将短文件名文件的文件名称为短文件名,以 免二者混淆。不论是存储长文件名的长目录项、存储别名的短目录项以及存 储短文件名的短目录项都是32字节的存储空间。其中存储别名的短目录项 和存储短文件名的短目录项的结构都是图1所示的结构,因此均称之为短目 录项。

本发明提供的解析长、短文件名的方法,读取并保存FAT文件系统中的 所有长文件名文件的长文件名,不保存所有长文件名文件的别名。但是保存 短文件名文件的短文件名。

一般情况下,人们不大专注长文件名文件的别名。即使使用其中的别名, 其应用范围也受到限制。因为该别名不超过8个字符。另外,长文件名和别 名在FAT文件系统中采用不同的编码。前者采用UNICODE编码;后者采用当 前系统编码(或称为本地编码),如GB2312-80编码。短文件名采用ASCII 编码。有些现有技术中将别名和短文件名均采用GB2312-80编码。但由于 GB2312-80编码是一种可变长编码,且一个中文字符用两个扩展ASCII码表 示,短文件名采用GB2312-80编码时,其实质是采用ASCII编码。舍弃别名 后可以减少一套系统编码,进而减少了系统的资源开销。

同时,短文件名采用的是ASCII编码。在ASCII编码前加0x00便很容 易转化为16位的UNICODE编码。因此,别名后,再将短文件名采用的ASCII 编码转化为UNICODE编码,最终获取的文件名均采用UNICODE编码,大大减 少了系统资源的开销。

对于某一个长文件名,解析时可以截取该文件名的一部分作为该文件名 的名称。这样可以进一步减少系统资源(尤其是存储空间)的开销。

本发明提供的解析FAT文件系统的文件名的方法流程如图4所示,该方 法包括如下步骤:

步骤1、嵌入式系统中读取长文件名和短文件名是在目录区中顺序读取 目录项,对于当前目录项执行如下操作。

步骤2、判断当前目录项是否为最后一个目录项,如果是则结束,否则 进入步骤3。

如果当前目录项的第一个字节为0,则该目录项为最后一个目录项,此 时直接结束解析。

如果当前目录项的第一个字节不是0,则该目录项不是最后一个目录项, 此时就跳转到步骤3。

步骤3、跳过无效的目录项。判断当前目录项是否为无效目录项,若是, 则转至步骤1读取下一目录项;否则,进入步骤4。

具体方法为:判断当前目录项的第一个字节是否为0xE5;如果当前目录 项的第一个字节为0xE5,则该目录项为无效的目录项。如果当前目录项为无 效的目录项,则进入步骤1,不读取该目录项,直接读取下一个目录项;否 则进入步骤4。

对于一些非期望的目录项,也可以在执行步骤3时先跳过。非期望的目 录项包括存储隐藏文件的文件名的目录项、存储卷标的目录项。

对于隐藏文件的文件名一般不需要读取出来,因此还可以跳过存储隐藏 文件的文件名的目录项。判断当前目录项是否为存储隐藏文件的文件名的目 录项,若是,则转至步骤1读取下一目录项;否则,进入步骤4。

具体方法为:判断当前目录项的第12个字节的第2位(bit)是否为1; 如果当前目录项的第12个字节的第2位(bit)为1,则该目录项存储的是 隐藏文件的文件名。如果当前目录项存储的是隐藏文件的文件名,则不读取 该目录项,直接读取下一个目录项。对下一个目录项执行步骤1。

对于卷标一般也不需要读取出来,因此还可以跳过存储卷标的目录项。 判断当前目录项是否为存储卷标的目录项,若是,则转至步骤1读取下一目 录项;否则,进入步骤4。

具体方法为:判断当前目录项的第12个字节的第4位(bit)是否为1; 如果当前目录项的第12个字节的第4位(bit)为1,则该目录项存储的是 卷标。如果当前目录项存储的是卷标,则不读取该目录项,直接读取下一个 目录项。对下一个目录项执行步骤1。

步骤4、判断当前目录项是长目录项还是短目录项,若当前目录项为长 目录项则进入步骤5,若当前目录项为短目录项则进入步骤6。

判断当前目录项是否为长目录项的方法为:

将当前目录项的第12个字节与0x3F进行与操作,若结果为0x0F,则当 前目录项为长目录项。

判断当前目录项是否为短目录项的方法为:

将当前目录项的第12个字节与0x1A进行与操作,若结果为0x10或 0x00,则当前目录项为短目录项。若结果为0x10,当前目录项存储的文件名 是一个文件的文件名;若结果为0x00,当前目录项存储的文件名是一个文件 夹的文件名。

步骤5、提供一阈值N(N为正整数),判断当前长目录项的序号M(M 为正整数)与阈值N之间的关系。如果M>N,则不保存当前长目录项中存储 的文件名字符,直接读取下一个目录项。对下一个目录项执行步骤1。如果 M≤N,则保存当前长目录项中存储的文件名字符,并设置目录项标志为长目 录项。继续读取下一个目录项,并对下一个目录项执行步骤1。作为一种优 选方式,设定目录项标志为1表示该目录项为长目录项;目录项标志为0, 表示该目录项为短目录项。

用上述方法截取长文件名,由于M为正整数,所保存的文件名只能由存 储在整数个长目录项当中的文件名字符构成。截取后的文件名长度不能是任 意的数值,在实际应用时,受到限制。例如某个长文件名有5个长目录项, N设为3或2或1。那么,截取后的文件名长度为39或26或13个字符,而 不能截取长度在13和26之间、26和39之间的文件名。

为了任意设定截取后的文件名长度,扩大实际应用的范围,对上述截取 长文件名的方法做了改进。步骤5替换为步骤5′:提供一阈值P(P为正整 数),判断当前长目录项的序号M(M为正整数)与阈值P之间的关系。如果 M>[P/13]+1,则不保存当前长目录项中存储的文件名字符;如果M≤ [P/13]+1,则执行如下步骤:

5.1′、顺序读取当前目录项中存储的文件名字符;

5.2′、判断当前文件名字符是否为文件名的结尾(文件名以0X00结尾)。 如果是文件名的结尾,则结束当前目录项文件名的读取,继续读取下一个目 录项,并对下一个目录项执行步骤1;如果不是文件名的结尾,若K+13(M-1) ≤P(K为当前文件名字符在目录项中的序号,K可取1-13中任意一整数), 则保存当前文件名字符;若K+13(M-1)>P,则不保存当前文件名字符,并 结束当前目录项的读取,继续读取下一个目录项,并对下一个目录项执行步 骤1。

上述方法由于获得了不仅可以读取并保存预定需要的P个文件名字符, 共同组成截取之后的文件名。同时,由于获得了文件名最后一个字符在整个 文件名中的序号,所以可以知道最终截取获得的文件名的长度。

步骤6包括如下步骤:

A、判断目录项标志是长目录项还是短目录项,若标志为短目录项,则 保存当前短目录项中存储的文件名字符;若标志为长目录项,则不保存当前 短目录项中存储的文件名字符;本步骤中可以先将文件名转换为UNICODE编 码后再保存。

如前文所述,目录项标志为1表示该目录项为长目录项;目录项标志为 0,表示该目录项为短目录项。如果判断目录项标志为0,则表示紧邻该短目 录项的前一个目录项不是长目录项,那么保存该短目录项中的短文件名,并 设置该文件的目录项标志为短目录项,即为0。如果判断目录项标志为1, 则表示紧邻该短目录项的前一个目录项是一个长目录项,那么不保存该短目 录项的短文件名,同时将目录项标志清0。

B、步骤A读取完当前短目录项之后,无论是否保存,都要将目录项标 志更新为短目录项,并转至步骤1读取下一目录项。无论是长文件名文件还 是短文件名文件,其文件名的存储都有且只有一个短目录项,只要读取完一 个短目录项,就表示解析了一个文件名。

作为一种优选的实施方式,本发明设置一文件序号参数,对读取的文件 进行编号。步骤6读取完当前短目录项之后,将当前读取到的文件的序号增 1,然后再转到步骤1继续下一个目录项的分析。此时,步骤2还可以判断 读取的文件数量是否超出指定数量。如果超出则结束,否则进入步骤3。具 体来说,步骤2先读取当前的文件序号,如果当前的文件序号大于指定值, 则结束;如果当前的文件序号小于或等于指定值,则进入步骤3。

步骤6中转至步骤1之前还可以保存短目录项中除了文件名字符(短文 件名或别名)之外的属性字段。

作为一种优选的实施方式,本发明还可以只读取若干种指定的扩展名的 文件(如只读取.mp3或.jpg的文件)。在步骤4和步骤6之间加入如下步骤: 如果当前目录项的第12个字节与0x1A进行与操作的结果为0x10,则当前目 录项存储的文件名是一个文件的文件名;那么读取当前目录项中存储的文件 的后缀名(目录项的第9到第11个字节数据),将该后缀名转成小写字母或 大写字母后与指定的扩展名比较,如果不相等,则转到步骤1继续下一个目 录项的读取,否则继续步骤6。如果步骤4中当前目录项的第12个字节与 0x1A进行与操作的结果为0x00,那么进入步骤6。

例如,若文件名原有30个字符,那么该文件名由3个长目录项和一个 短目录项构成的目录链存储。按照存储的先后顺序,依次为序号为3、2、1 的长目录项和与长目录项1相邻的短目录项。其中,长目录项3存储了4个 文件名字符,长目录项2和1都存储了13个字符。系统解析文件名时,依 次读取长目录项3,2、1和短目录项。

若设定截取后的文件名由2个长目录项存储,即N=2。

那么对于长目录项3,步骤3判断为长目录项,执行步骤4,不保存长 目录项3中存储的文件名字符。对于长目录项2,步骤3判断为长目录项, 执行步骤4保存长目录项2中存储的文件名字符。对于长目录项1,其中的 文件名解析与长目录项2相同。每读取一个长目录项后将目录项标志设置为 1。对于短目录项,步骤3判断为短目录项,然后进行步骤5,保存短目录项 中除了短文件名或别名之外的属性字段。由于目录项标志为1,所以不保存 该短目录项的短文件名,然后将目录项标志清0。

因此,最终截取的文件名为26个字符。

若设定截取后的文件名由20个字符组成,即P=20,[P/13]+1=2。

那么对于长目录项3,步骤3判断为长目录项,执行步骤4′,不保存长 目录项3中存储的文件名字符。对于长目录项2,步骤3判断为长目录项, 执行步骤4′,保存长目录项2中存储的第1-7个文件名字符。最后一个字符 在整个文件名的序号为20,所以最终截取获得的文件名的长度为20个字符。 对于长目录项1,其中存储的文件名字符全部被保存。每读取一个长目录项 后将目录项标志设置为1。对于短目录项,步骤3判断为短目录项,然后进 行步骤5,保存短目录项中除了短文件名或别名之外的属性字段。由于目录 项标志为1,所以不保存该短目录项的短文件名,然后将目录项标志清0。

因此,最终截取的文件名为20个字符。

又例如,若文件名原有17个字符,那么该文件名由2个长目录项和一 个短目录项构成的目录链存储。按照存储的先后顺序,依次为序号为2、1 的长目录项和与长目录项1相邻的短目录项。其中,长目录项2存储了4个 文件名字符,长目录项1存储了13个字符。系统解析文件名时,依次读取 长目录项2、1和短目录项。

若设定截取后的文件名由2个长目录项存储,即N=2。

对于长目录项2,步骤3判断为长目录项,执行步骤4保存长目录项2 中存储的文件名字符。对于长目录项1,其中的文件名解析与长目录项2相 同。每读取一个长目录项后将目录项标志设置为1。对于短目录项,步骤3 判断为短目录项,然后进行步骤5,保存短目录项中除了短文件名或别名之 外的属性字段。由于目录项标志为1,所以不保存该短目录项的短文件名, 然后将目录项标志清0。

因此,最终截取的文件名为17个字符,但系统不能给出参数指出该截 取后的文件名长度。

若设定截取后的文件名由15个字符组成,即P=15,[P/13]+1=2。

对于长目录项2,步骤3判断为长目录项,执行步骤4′,保存长目录项 2中存储的第1-2个文件名字符。最后一个字符在整个文件名的序号为15, 所以最终截取获得的文件名的长度为15个字符。对于长目录项1,其中存储 的文件名字符全部被保存。每读取一个长目录项后将目录项标志设置为1。 对于短目录项,步骤3判断为短目录项,然后进行步骤5,保存短目录项中 除了短文件名或别名之外的属性字段。由于目录项标志为1,所以不保存该 短目录项的短文件名,然后将目录项标志清0。

因此,最终截取的文件名为15个字符,并且系统能够给出参数“15”, 以指出该截取后的文件名长度。

在不偏离本发明的精神和范围的情况下还可以构成许多有很大差别的 实施例。应当理解,除了如所附的权利要求所限定的,本发明不限于在说明 书中所述的具体实施例。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号