函数
getattrlist,fgetattrlist,getattrlistat——获取文件系统属性
函数原型
#include <sys/attr.h>
#include <unistd.h>
int getattrlist(const char* path, struct attrlist* attrList, void * attrBuf, size_t attrBufSize,unsigned long options);
int fgetattrlist(int fd, struct attrlist *attrList, void * attrBuf, size_t attrBufSize,unsigned long options);
int getattrlistat(int fd, const char*path, struct attrlist * attrList, void* attrBuf, size_t attrBufSize, unsigned longoptions);
描述
getattrlist()函数返回文件系统对象的属性(即元数据)。getattrlist()函数用在文件是路径时,而fgetattrlist()则用在文件是文件描述符时。
除了路径是相对路径时,系统调用getattrlistat()等价于getattrlist()。路径是相对路径时,返回相对于文件描述符(而非当前工作路径)的path路径的属性。如果getattrlistat()的fd参数是AT_FDCWD,使用的是当前工作目录,此时与调用getattrlist()效果一致。
可以把getattrlist()看作是stat()的加强版。他们都通过attrBuf和 attrBufSize指定的缓冲区返回指定文件系统的属性。参数attrList指定返回什么属性,参数options让你控制函数行为的具体方面。
并非所有的卷都支持所有的属性。详见ATTR_VOL_ATTRIBUTES部分关于如何判断一个卷是否支持特定属性的描述。
此外,你应该只请求你所需要的属性。在某些卷格式上获取某些属性需要高消耗的计算。例如,在non-HFS[Plus]卷上,计算ATTR_DIR_ENTRYCOUNT属性消耗非常高。所以不需要的属性尽量不要去请求。
参数path必须引用有效的文件系统对象。读写和运行的权限都不需要,但path所指向的所有目录必须是可搜索的。
参数attrList指向attrlist结构体,该结构体定义在<sys/attr.h>。它指定函数返回什么属性,在调用函数前需要填充该结构体。结构体定义如下:
typedef u_int32_t attrgroup_t;
struct attrlist {
u_short bitmapcount; /* numberof attr. bit sets in list */
u_int16_t reserved; /* (to maintain 4-byte alignment) */
attrgroup_t commonattr; /* commonattribute group */
attrgroup_t volattr; /* volumeattribute group */
attrgroup_t dirattr; /*directory attribute group */
attrgroup_t fileattr; /* fileattribute group */
attrgroup_t forkattr; /* forkattribute group */
};
#define ATTR_BIT_MAP_COUNT 5
各字段定义如下:
Bitmapcount:属性数
Reserved:保留。必须置零
Commonattr:公共属性请求位。公共属性与所有类型的文件系统相关。
Volattr:卷属性请求位。卷属性与卷(即挂载的文件系统)相关。如果请求卷属性,path路径必须指向一个卷的根目录。此外,你请求了文件或目录的属性就不能请求卷属性。
Dirattr:目录属性请求位。
Fileattr:文件属性请求位。
Forkattr:叉属性请求位。
除了在下表中特别说明的,属性都是只读的。Setattrlist()可以把属性设为读/写。
参数attrBuf 和 attrBufSize指定保存属性的缓冲区。这个缓冲区的格式非常复杂(不在这里讨论),它的初始内容会被忽略。
参数options是函数的行为控制标志位,具体值定义如下:
FSOPT_NOFOLLOW:设置后,如果它作为路径的最后一个组件,它将不会跟随符号链接。
FSOPT_REPORT_FULLSIZE:报告属性的大小就是全部请求属性的大小,如果不设,报告的大小就是实际返回的大小。
FSOPT_PACK_INVAL_ATTRS:设置后,返回全部请求的属性,包括不支持的也会返回。
FSOPT_ATTR_CMN_EXTENDED:设置后,ATTR_CMN_GEN_COUNT和ATTR_CMN_DOCUMENT_ID可以被请求。