_stat函数的功能
_stat函数用来获取指定路径的文件或者文件夹的信息。
函数声明
int _stat( const char *path, struct _stat *buffer );
参数:
path——文件或者文件夹的路径
buffer——获取的信息保存在内存中
返回值:
正确——返回0
错误——返回-1,具体错误码保存在errno中
struct _stat结构体
_stat结构体是文件(夹)信息的结构体,定义如下:
struct stat { _dev_t st_dev; //文件所在磁盘驱动器号 _ino_t st_ino; //inode,FAT、NTFS文件系统无意义 unsigned short st_mode; //文件、文件夹的标志 short st_nlink; //非NTFS系统上通常为1 short st_uid; //UNIX系统上为userid,windows上为0 short st_gid; //UNIX系统上为groupid,windows上为0 _dev_t st_rdev; //驱动器号,与st_dev相同 _off_t st_size; //文件字节数 time_t st_atime; //上次访问时间 time_t st_mtime; //上次修改时间 time_t st_ctime; //创建时间 };
以上信息就是可以通过_stat函数获取的所有相关信息,一般情况下,我们关心文件大小和创建时间、访问时间、修改时间。
例子
注:该例子来自MSDN,http://msdn.microsoft.com/en-us/library/14h5k7ff.aspx
// crt_stat.c // This program uses the _stat function to // report information about the file named crt_stat.c. #include <time.h> #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <errno.h> int main( void ) { struct _stat buf; int result; char timebuf[26]; char* filename = "crt_stat.c"; errno_t err; // Get data associated with "crt_stat.c": result = _stat( filename, &buf ); // Check if statistics are valid: if( result != 0 ) { perror( "Problem getting information" ); switch (errno) { case ENOENT: printf("File %s not found. ", filename); break; case EINVAL: printf("Invalid parameter to _stat. "); break; default: /* Should never be reached. */ printf("Unexpected error in _stat. "); } } else { // Output some of the statistics: printf( "File size : %ld ", buf.st_size ); printf( "Drive : %c: ", buf.st_dev + 'A' ); err = ctime_s(timebuf, 26, &buf.st_mtime); if (err) { printf("Invalid arguments to ctime_s."); exit(1); } printf( "Time modified : %s", timebuf ); } }
输出大致如下:
File size :732
Drive :C:
Time modified :Thu Feb 07 14:39:36 2002
支持不同时间长度和文件长度
_stat函数中时间定义为64位,文件长度也定义为32位,同时使用char*表示文件名称。我们知道可以时间可以定义为64位和32位:__time64和__time32,文件名也可以用宽字符来表示,文件长度也可以定义为64位。因此该函数有很多变体,这些函数用法都是一样的,我们根据具体情况选择使用哪个函数。
int _stat( const char *path, struct _stat *buffer ); int _stat32( const char *path, struct __stat32 *buffer ); int _stat64( const char *path, struct __stat64 *buffer ); int _stati64( const char *path, struct _stati64 *buffer ); int _stat32i64(str const char *path, struct _stat32i64 *buffer ); int _stat64i32(str const char *path, struct _stat64i32 *buffer ); int _wstat( const wchar_t *path, struct _stat *buffer ); int _wstat32( const wchar_t *path, struct __stat32 *buffer ); int _wstat64( const wchar_t *path, struct __stat64 *buffer ); int _wstati64( const wchar_t *path, struct _stati64 *buffer ); int _wstat32i64( const wchar_t *path, struct _stat32i64 *buffer ); int _wstat64i32( const wchar_t *path, struct _stat64i32 *buffer );