WIN32上struct __stat64和struct _stati64有什么区别?

时间:2011-07-04 03:16:17

标签: winapi 64-bit msdn stat widechar

我正在研究一些代码,这些代码需要在WIN2000以后的每个版本的Windows上运行,并且还需要使用宽文件路径。

我需要调用stat的某个变体来获取文件长度。该文件可能大于4GB。

以下是MSDN Visual Studio .NET 2003 [1]文档中的相关部分:


int _stat(
   const char *path,
   struct _stat *buffer 
);
int _stat64(
   const char *path,
   struct __stat64 *buffer 
);
int _stati64(
   const char *path,
   struct _stati64 *buffer 
);
int _wstat(
   const wchar_t *path,
   struct _stat *buffer 
);
int _wstat64(
   const wchar_t *path,
   struct __stat64 *buffer 
);
int _wstati64(
   const wchar_t *path,
   struct _stati64 *buffer 
);

[1] http://msdn.microsoft.com/en-us/library/14h5k7ff(v=VS.71).aspx

我无法弄清楚__stat64结构和_stati64结构之间的区别。我知道我想使用_wstat64_wstati64,但MSDN保持沉默,更好

有什么建议吗?

3 个答案:

答案 0 :(得分:4)

我不是百分百肯定,但似乎是:

  • stat:32位时间戳,32位文件大小
  • stat64:64位时间戳,32位文件大小
  • stati64:64位时间戳,64位文件大小

所以你需要wstati64

以下关于MSDN的段落:

  

如果文件上的日期戳晚于1970年1月1日午夜,并且在2038年1月18日19:14:07之前,则可以表示该日期戳,除非您使用_stat64或{{1}在这种情况下,日期可以表示为UTC,12月31日23:59:59。

  

<强> _wstat64   文件大小(以字节为单位); st_size_stati64

的64位整数

答案 1 :(得分:3)

以下是mingw wchar.h #include文件中的__stat64和_stati64结构:


#if defined (__MSVCRT__)
struct _stati64 {
    _dev_t st_dev;
    _ino_t st_ino;
    unsigned short st_mode;
    short st_nlink;
    short st_uid;
    short st_gid;
    _dev_t st_rdev;
    __int64 st_size;
    time_t st_atime;
    time_t st_mtime;
    time_t st_ctime;
};

#if __MSVCRT_VERSION__ >= 0x0601
struct __stat64
{
    _dev_t st_dev;
    _ino_t st_ino;
    _mode_t st_mode;
    short st_nlink;
    short st_uid;
    short st_gid;
    _dev_t st_rdev;
    __int64 st_size;
    __time64_t st_atime;
    __time64_t st_mtime;
    __time64_t st_ctime;
};

根据这些结构,似乎_stat64是比stati64更好的选择,因为:

  1. st_mode_mode_t而非unsigned short
  2. 时间表示为_time64_t而不是time_t,因此它具有可以由NTFS文件系统表示的相同范围,并且不会削弱为32位{{1 }}。
  3. 我仍然感到困惑,但这似乎更接近正确答案。

    另请注意time_t需要_stat64&gt; MSVCRT_VERSION,这意味着它更现代化。

答案 2 :(得分:0)

The documentation说:

  

第一个数字后缀(3264)表示所用时间类型的大小; 第二个后缀是i32i64,表示文件大小是表示为32位还是64位整数。< / p>