VXWORKS文件系统属性和相关操作描述(dosFS)

wuf511 2010-07-23 03:52:33

打开整个设备(raw模式)。
警告:因为设备名是被使用简单子链匹配的i/o系统识别的,所以文件系统不使用单独的斜杠(/)作为文件名。如果使用斜杠可能发生意外的结果。
可以使用usrfdconfig()装载卷,但是这个程序不返回dos_vol_desc结构。用usrfdconfig()装载的卷不能使用许多dosfs命令,包括dosfsvolunmount()。不过dofs的ioctl()命令(包括fiounmount)通过fd存取卷信息,所以可以和usrfdconfig()一起使用。

文件i/o
dosfs文件系统设备上的文件创建、删除、读写都使用标准vxworks i/o程序: creat( )、 remove( )、 write( )和read( )。


整个设备的打开(raw模式)
可以打开整个的dosfs卷。这是在open()和creat()调用期间通过只指定设备名来实现。当一个合法文件被打开时返回一个文件描述符;然而,在文件操作符上的操作影响整个设备。以这种方式打开整个卷叫作raw模式。
打开整个设备的通常原因是为ioctl()函数获得一个不属于某个文件的文件描述符。如fionfree函数,它返回在卷上的有效字节数。然而,对于许多此类函数,文件描述符可以是任何打开的此卷的,甚至一个特定文件的文件描述符。
当一个磁盘用ms-dos数据结构初始化(引导扇区、空的根目录、fat)时,以raw模式打开此设备。ioctl()函数fiodiskinit执行初始化。
可以以raw模式读写磁盘上的数据。在这种模式下,整个的磁盘数据区被看作一个单独的大文件。没有目录条目用来描述用raw模式写的任何数据。
有关对整个设备(包括使用ms-dos的数据结构的区域)低级i/o,,见4.4 raw文件系统:rawfs和有关“vxworks 参考手册>库”下的rawfslib的在线参考。

子目录创建
当子目录达到最大条目数时,子目录可以在根目录以外的任何目录下创建。子目录有两种创建方式:
1. 使用带有fiomkdir函数的ioctl():目录名传递给ioctl()。ioctl()调用使用的文件描述符可以通过以下方式获得:打开整个卷(raw模式)、一个正规文件或卷上的另一个目录。
2. 使用open():创建一个目录,o_creat选项必须设置在标记参量中打开,fstat_dir选项必须设置在模式参量中。open()调用返回一个文件描述符(描述新目录)。这个文件描述符用于只读,当不再需要时关闭这个描述符。
使用以上两种方法的任意一种方法创建目录,新目录名必须被指明。这个名字可以是一个全称路径名,或是一个相对于当前工作目录的路径名。

子目录删除
被删除的目录必须是空的(除了“.”和“..”条目)。删除目录有两种方法:
1. 使用带有fiormdir函数的ioctl()调用,指定目录名。另外,文件描述符可以指向卷上的任何文件、目录、或卷自己。
2. 使用remove()函数,指定目录名。

目录条目
每个dosfs目录包含一组条目描述它的文件和子目录。每个条目包含有关文件或子目录的信息:
文件名
一个8字节字符串(如果需要,空格填补)指定文件名。(命名可以长至40个字符;详情见4.2.18长文件名支持)
文件扩展名
一个3字节的字符串(空格填补)指定文件名或子目录名的一个延长部分。(如果选择了不受8.3版本限制的高级文件名,扩展概念是不适用的。)
文件属性
一个字节域指定文件的特征;
时间
文件编码创建修改的时间
日期
文件编码的创建修改的日期
簇号
文件内开始簇的数目。通过搜索fat找后来的簇
文件大小
文件的大小,对描述子目录的条目来说这个域通常为零。

读目录条目
在dosfs卷上的目录可以使用opendir(),readdir(),rewinddir(),和closedir()程序来搜索。这些调用可以用来确定文件名和子目录。
使用fstat()或stat()函数可以获得有关指定文件更详细的信息。连同标准文件信息,被这些程序使用的结构还从目录条目返回文件属性字节。


文件属性
在dosfs目录条目中的文件属性字节由一组标记位组成,每位标志一个特殊的文件特征。文件属性字节描述的特征见下表。
表:文件属性字节中的标记

vxworks 标记名 十六进制值 描述

dos_attr_rdonly 0x01 只读
dos_attr_hidden 0x02 隐藏文件
dos_attr_system 0x04 系统文件
dos_attr_vol_label 0x08 卷标
dos_attr_directory 0x10 子目录
dos_attr_archive 0x20 存档文件


当一个文件被打开为o_wronly或o_rdwr时,dos_attr_rdonly被选中。如果标记设置了,open()返回error,并且设置errnos为_dosfslib_read_only。
警告:ms-dos隐藏文件和系统文件标记(dos_attr_hidden和dos_attr_system)被dosfslib忽略。虽然他们保持完整,但他们不产生特殊的处理(例如,带有这些标记的条目当搜索目录时被公布)。

卷标标记dos_attr_vol_label用来说明一个包含磁盘的dosfs卷标的目录条目。标签不是必须的,如果使用了,每卷只有一个卷标条目,在根目录中。当读一个目录的内容时,卷标条目不被报告(用readdir())。只有使用ioctl()函数fiolabelget时,卷标条目才被确定。使用ioctl()函数fiolabelset,卷标可以被设置成任何11个字符或更少字符的字符串。在这些ioctl()调用期间任何打开到此卷的文件描述符都可以使用。
目录标记dos_attr_directory用来指出这个条目不是一个正规的文件而是一个子目录。
存档标记dos_attr_archive在文件被创建或修改时被设置。这个标记被其他搜索卷的程序(寻找修改过的文件并选择存档)使用。这样的程序必须清除存档标记,因为vxworks不做这个工作 。
属性字节中的所有标记(除了目录和卷标标记)可以使用ioctl()函数filoattribset设置或清除。这个函数调用在指定文件打开后改变其属性。在filattribset调用中指定的属性字节值被直接复制;为了保护存在的标记设置,使用stat()或fstat()确定当前的属性,然后使用and和or操作改变他们。
例:设置dosfs文件属性
这个例子使一个dosfs文件只读,并保持其他属性不变
#include "vxworks.h"
#include "iolib.h"
#include "dosfslib.h"
#include "sys/stat.h"
#include "fcntl.h"
status changeattributes (void)
{
int fd;
struct stat statstruct;
/* open file */
if ((fd = open ("file", o_rdonly, 0)) == error)
return (error);
/* get directory entry data */
if (fstat (fd, &statstruct) == error)
return (error);
/* set read-only flag on file */
if (ioctl (fd, fioattribset, (statstruct.st_attrib | dos_attr_rdonly))
== error)
return (error);
/* close file */
close (fd);
}


文件日期和时间
目录条目包含一个文件和目录的时间和日期。这个时间在文件创建时被设置,并在文件被修改后关闭时被更新。描述子目录的条目不被更新——它们总是包含目录的创建日期和时间。
dosfslib库在内在结构中维持日期和时间。然而通常没有一个装置来自动更新时间和日期,这提供了两种不同的设置日期和时间的方法。
第一种方法应用两个程序dosfsdateset()和dosfstimeset()。使用如下:

dosfsdateset(1990,12,25)/*设置日期为1990年12月25日*/
dosfstimeset(14,30,22)/*设置时间为14:30:22*/

必须按时调用这些程序来更新日期和时间的值。
第二种方法要求一个用户支持的钩子程序。如果使用dosfsdatetimeinstall()安装了时间和日期的钩子程序,只要dosfslib要求获取当前日期和时间,程序就被调用。这样可以利用可被读取硬件日历时钟来获取当前时间。也可以用于其它的维持当前时间日期的应用软件。
定义日期/时间钩子程序如下(datetimehook是一个例子名,真正的程序名可以是任何名)
void datetimehook
(
dos_date_time * pdatetime /* ptr to dosfs date & time struct */
)
在钩子程序的入口,包含最近的时间和日期的dos_date_time结构设置在dosfslib中。接下来,钩子程序用当前正确的时间和日期填充结构。结构中没有发生改变的区域保持先前的值。
ms-dos规格在文件时间标记上仅提供了2秒间隔的时间戳。如果在dosfstimeset()或日期/时间钩子程序里指定的秒数是带零头的,那么它四舍五入到下一个偶数。
...全文
1910 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

2,179

社区成员

发帖
与我相关
我的任务
社区描述
xworks是美国 Wind River System 公司( 以下简称风河公司 ,即 WRS 公司)推出的一个实时操作系统。
社区管理员
  • VxWorks开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧