获取有关打开文件的信息。

语法

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 指示错误。 如果文件描述符无效,或者 bufferNULL,会调用无效的参数处理程序,如参数验证中所述。 如果允许执行继续,那么对于无效文件描述符,将 errno 设置为 EBADF;而如果 bufferNULL,则设置为 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_atimest_ctimest_mtimest_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 位文件长度。 第一个数字后缀(3264)表示所用时间类型的大小;第二个后缀是 i32i64,表示以 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 函数