linux fstat函数返回错误,[转载]函数stat,lstat,fstat的使用

函数原型#include

int stat(const char

*restrict pathname, struct stat *restrict buf);

提供文件名字,获取文件对应属性。

int fstat(int filedes,

struct stat *buf);

通过文件描述符获取文件对应的属性。

int lstat(const char

*restrict pathname, struct stat *restrict buf);

连接文件描述命,获取文件属性。

一眼就能看出来fstat的第一个参数是和另外两个不一样的,对!fstat区别于另外两个系统调用的地方在于,fstat系统调用接受的是

一个“文件描述符”,而另外两个则直接接受“文件全路径”。文件描述符是需要我们用open系统调用后才能得到的,而文件全路经直接写就可以了。

stat

和lstat的区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。(似乎有些晕吧,这样记,lstat比stat多了一个l,因此它是有本事处理符号链接文件的,因此当遇到符号链接文件时,lstat当然不会放过。而

stat系统调用没有这个本事,它只能对符号链接文件睁一只眼闭一只眼,直接去处理链接所指文件喽)2

文件对应的属性

struct stat {

mode_t st_mode; //文件对应的模式,文件,目录等

ino_t st_ino; //inode节点号

dev_t st_dev; //设备号码

dev_t st_rdev; //特殊设备号码

nlink_t st_nlink; //文件的连接数

uid_t st_uid; //文件所有者

gid_t st_gid; //文件所有者对应的组

off_t st_size; //普通文件,对应的文件字节数

time_t st_atime; //文件最后被访问的时间

time_t st_mtime; //文件内容最后被修改的时间

time_t st_ctime; //文件状态改变时间

blksize_t

st_blksize; //文件内容对应的块大小

blkcnt_t st_blocks; //伟建内容对应的块数量

};

可以通过上面提供的函数,返回一个结构体,保存着文件的信息.

3

获取文件属性的几个封装函数///

// 功能说明 : 判断是否link文件

// 输入参数 :

// 输出参数 : VOID

// 返回值 : YCPP_BOOL

// 使用说明 :

///

YCPP_BOOL IsLink ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0

&& S_ISLNK (st.st_mode) );

}

///

// 功能说明 : 判断是否block文件

// 输入参数 :

// 输出参数 : VOID

// 返回值 : YCPP_BOOL

// 使用说明 :

///

YCPP_BOOL IsBlk ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0

&& S_ISBLK (st.st_mode) );

}

///

// 功能说明 : 判断是否FIFO文件

// 输入参数 :

// 输出参数 : VOID

// 返回值 : YCPP_BOOL

// 使用说明 :

///

YCPP_BOOL IsFifo ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0

&& S_ISFIFO (st.st_mode) );

}

///

// 功能说明 : 判断是否目录文件

// 输入参数 :

// 输出参数 : VOID

// 返回值 : YCPP_BOOL

// 使用说明 :

///

YCPP_BOOL IsDir ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0

&& S_ISDIR (st.st_mode) );

}

///

// 功能说明 : 判断是否设备文件

// 输入参数 :

// 输出参数 : VOID

// 返回值 : YCPP_BOOL

// 使用说明 :

///

YCPP_BOOL IsDevice ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0

&& S_ISCHR (st.st_mode) );

}

///

// 功能说明 : 判断是否普通文件

// 输入参数 :

// 输出参数 : VOID

// 返回值 : YCPP_BOOL

// 使用说明 :

///

YCPP_BOOL IsFile ( const char * szDirName )

{

struct stat st;

return ( lstat (szDirName, &st) == 0

&& S_ISREG (st.st_mode) );

}

///

// 功能说明 : 判断是否可读

// 输入参数 :

// 输出参数 : VOID

// 返回值 : YCPP_BOOL

// 使用说明 :

///

YCPP_BOOL canAccess ( const char *szFileName )

{

if( access(szFileName, R_OK) == 0 )

return YCPP_TRUE;

return YCPP_FALSE;

}

///

// 功能说明 : 判断是否可修改

// 输入参数 :

// 输出参数 : VOID

// 返回值 : YCPP_BOOL

// 使用说明 :

///

YCPP_BOOL canModify ( const char *szFileName )

{

if ( access(szFileName, W_OK | R_OK) == 0 )

return YCPP_TRUE;

return YCPP_FALSE;

}

///

// 功能说明 : 获取文件上次修改时间

// 输入参数 :

// 输出参数 : VOID

// 返回值 : YCPP_RET

// 使用说明 :

///

YCPP_RET FileLastMTime ( const char *szFileName )

{

struct stat st;

memset ( &st, 0, sizeof(struct stat) );

if ( lstat (szFileName, &st) == 0 )

return st.st_mtime;

printf ( "%s FileLastMTime error %sn", szFileName, strerror(errno)

);

return -1;

}

///

// 功能说明 : 获取文件大小,以字节为单位

// 输入参数 :

// 输出参数 : VOID

// 返回值 : YCPP_RET

// 使用说明 :

///

YCPP_RET FileSize ( const char *szFileName )

{

struct stat st;

memset ( &st, 0, sizeof(struct stat) );

if ( lstat (szFileName, &st) == 0 )

return st.st_size;

printf ( "%s FileSize error %sn", szFileName, strerror(errno)

);

return -1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值