获取有关打开文件的信息。
语法
int _fstat(
int fd,
struct _stat *buffer
);
int _fstat32(
int fd,
struct _stat32 *buffer
);
int _fstat64(
int fd,
struct _stat64 *buffer
);
int _fstati64(
int fd,
struct _stati64 *buffer
);
int _fstat32i64(
int fd,
struct _stat32i64 *buffer
);
int _fstat64i32(
int fd,
struct _stat64i32 *buffer
);
参数
fd
打开文件的文件描述符。
buffer
指向存储结果的结构的指针。
返回值
如果获取到文件状态信息,则返回 0。 返回值 -1 指示错误。 如果文件描述符无效,或者 buffer
是 NULL
,会调用无效的参数处理程序,如参数验证中所述。 如果允许执行继续,那么对于无效文件描述符,将 errno
设置为 EBADF
;而如果 buffer
是 NULL
,则设置为 EINVAL
。
备注
_fstat
函数可获取有关与 fd
关联的打开文件的信息,并将其存储在 buffer
指向的结构中。 SYS\Stat.h
中定义的 _stat
结构包含下列字段。
字段 | 含义 |
---|---|
st_atime |
上次文件访问的时间。 |
st_ctime |
文件的创建时间。 |
st_dev |
如果是设备,则为 fd ;否则为 0。 |
st_mode |
文件模式信息的位掩码。 如果 fd 指的是设备,则设置 _S_IFCHR 位。 如果 fd 指的是普通文件,则设置 _S_IFREG 位。 将根据文件的权限模式设置读/写位。 在 SYS\Stat.h 中定义 _S_IFCHR 和其他常量。 |
st_mtime |
上次进行文件修改的时间。 |
st_nlink |
在非 NTFS 文件系统上始终为 1。 |
st_rdev |
如果是设备,则为 fd ;否则为 0。 |
st_size |
文件的大小(字节)。 |
如果 fd
指的是设备,st_atime
、st_ctime
、st_mtime
和 st_size
字段无意义。
由于 Stat.h
使用在 Types.h
中定义的 _dev_t
类型,因此你必须在代码中包含 Types.h
,且将其置于 Stat.h
前面。
使用 _stat64
结构的 _fstat64
允许文件创建日期最大表示为 3000 年 12 月 31 日 23:59:59,UTC;而其他函数只能表示截至 2038 年 1 月 18 日 23:59:59,UTC 之前的日期。 所有这些函数的日期范围下限是 1970 年 1 月 1 日午夜。
这些函数的变体支持 32 位或 64 位时间类型以及 32 位或 64 位文件长度。 第一个数字后缀(32
或 64
)表示所用时间类型的大小;第二个后缀是 i32
或 i64
,表示以 32 位还是 64 位整数表示文件大小。
除非定义了 _USE_32BIT_TIME_T
,否则 _fstat
与 _fstat64i32
等效,并且 _stat
包含 64 位时间。 如果定义了 _USE_32BIT_TIME_T
,_fstat
使用 32 位时间,并且 _stat
包含 32 位时间。 这一点也适用于 _fstati64
。
默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此行为,请参阅 CRT 中的全局状态。
_stat
的时间类型和文件长度类型变体
函数 | 已定义 _USE_32BIT_TIME_T ? |
时间类型 | 文件长度类型 |
---|---|---|---|
_fstat |
未定义 | 64 位 | 32 位 |
_fstat |
已定义 | 32 位 | 32 位 |
_fstat32 |
不受宏定义影响 | 32 位 | 32 位 |
_fstat64 |
不受宏定义影响 | 64 位 | 64 位 |
_fstati64 |
未定义 | 64 位 | 64 位 |
_fstati64 |
已定义 | 32 位 | 64 位 |
_fstat32i64 |
不受宏定义影响 | 32 位 | 64 位 |
_fstat64i32 |
不受宏定义影响 | 64 位 | 32 位 |
要求
函数 | 必需的标头 |
---|---|
_fstat |
<sys/stat.h> 和 <sys/types.h> |
_fstat32 |
<sys/stat.h> 和 <sys/types.h> |
_fstat64 |
<sys/stat.h> 和 <sys/types.h> |
_fstati64 |
<sys/stat.h> 和 <sys/types.h> |
_fstat32i64 |
<sys/stat.h> 和 <sys/types.h> |
_fstat64i32 |
<sys/stat.h> 和 <sys/types.h> |
有关兼容性的详细信息,请参阅 兼容性。
示例
// crt_fstat.c
// This program uses _fstat to report
// the size of a file named F_STAT.OUT.
#include <io.h>
#include <fcntl.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <share.h>
int main( void )
{
struct _stat buf;
int fd, result;
char buffer[] = "A line to output";
char timebuf[26];
errno_t err;
_sopen_s( &fd,
"f_stat.out",
_O_CREAT | _O_WRONLY | _O_TRUNC,
_SH_DENYNO,
_S_IREAD | _S_IWRITE );
if( fd != -1 )
_write( fd, buffer, strlen( buffer ) );
// Get data associated with "fd":
result = _fstat( fd, &buf );
// Check if statistics are valid:
if( result != 0 )
{
if (errno == EBADF)
printf( "Bad file descriptor.\n" );
else if (errno == EINVAL)
printf( "Invalid argument to _fstat.\n" );
}
else
{
printf( "File size : %ld\n", buf.st_size );
err = ctime_s(timebuf, 26, &buf.st_mtime);
if (err)
{
printf("Invalid argument to ctime_s.");
exit(1);
}
printf( "Time modified : %s", timebuf );
}
_close( fd );
}
File size : 16
Time modified : Wed May 07 15:25:11 2003
另请参阅
文件处理
%>
%>
%>
_stat
、_wstat
函数