4

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

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

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

int _stat(
   const char *路径,
   结构 _stat *buffer
);
诠释_stat64(
   const char *路径,
   结构 __stat64 *buffer
);
int _stati64(
   const char *路径,
   结构 _stati64 *buffer
);
诠释_wstat(
   const wchar_t *path,
   结构 _stat *buffer
);
int _wstat64(
   const wchar_t *path,
   结构 __stat64 *buffer
);
int _wstati64(
   const wchar_t *path,
   结构 _stati64 *buffer
);

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

我无法弄清楚__stat64结构和_stati64结构之间的区别。我知道我想使用_wstat64,或者_wstati64但 MSDN 没有说明哪个更好

有什么建议么?

4

3 回答 3

5

Here are the __stat64 and the _stati64 structures from the mingw wchar.h #include file:

#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;
};

According to these structures, it seems that _stat64 is a better choice than stati64 because:

  1. st_mode is _mode_t and not unsigned short
  2. Time is expressed as a _time64_t and not a time_t, so it has the same range that can be expressed by the NTFS file system, and is not crippled to the 32-bit time_t.

I'm still confused, but this seems closer to the correct answer.

Notice also that the _stat64 requires MSVCRT_VERSION > 0x0601, which implies that it is more modern.

于 2011-07-04T17:31:31.153 回答
3

我不是 100% 确定,但看起来像:

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

所以你需要wstati64.

这来自 MSDN 上的以下段落:

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

st_size 文件大小(以字节为单位);一个 64 位整数,用于_stati64_wstati64

于 2011-07-04T03:24:52.683 回答
1

The documentation says:

The first numerical suffix (32 or 64) indicates the size of the time type used; the second suffix is either i32 or i64, indicating whether the file size is represented as a 32-bit or 64-bit integer.

于 2011-07-04T03:26:44.660 回答