【问题标题】:What's the difference between struct __stat64 and struct _stati64 on WIN32?WIN32 上的 struct __stat64 和 struct _stati64 有什么区别?
【发布时间】:2011-09-27 20:39:56
【问题描述】:

我正在编写一些代码,这些代码需要在自 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 对哪个更好保持沉默。

有什么建议吗?

【问题讨论】:

标签: winapi 64-bit msdn stat widechar


【解决方案1】:

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

#如果已定义(__MSVCRT__) 结构 _stati64 { _dev_t st_dev; _ino_t st_ino; 无符号短 st_mode; 短 st_nlink; 短st_uid; 短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 结构 __stat64 { _dev_t st_dev; _ino_t st_ino; _mode_t st_mode; 短 st_nlink; 短st_uid; 短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位time_t

我仍然很困惑,但这似乎更接近正确答案。

还要注意_stat64 需要MSVCRT_VERSION > 0x0601,这意味着它更现代。

【讨论】:

    【解决方案2】:

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

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

    所以你需要wstati64

    这来自 MSDN 上的以下段落:

    如果文件上的日期戳晚于 1970 年 1 月 1 日午夜和 2038 年 1 月 18 日 19:14:07 之前,则可以表示文件上的日期戳,除非您使用 _stat64_wstat64,其中如果日期可以表示为 UTC 时间 3000 年 12 月 31 日 23:59:59。

    st_size 文件大小(以字节为单位); _stati64_wstati64 的 64 位整数

    【讨论】:

    • 好的。看起来我需要 wstati64。不过,这仍然让我很困惑。
    • 其实,请看下面我的回答...(我会把它放在这里,但我不能将
       格式放在评论中。
    • 请注意,您的摘要有一个错误 stat64 具有 64 位文件大小,显示在 docs.microsoft.com/en-us/cpp/c-runtime-library/reference/…stati64 的区别在于后者具有取决于定义的时间戳
    • @Flamefire:它说“这些函数的变体支持 32 位或 64 位时间类型,以及 32 位或 64 位文件长度。第一个数字后缀(32 或 64)表示大小使用的时间类型;第二个后缀是 i32 或 i64,指示文件大小是表示为 32 位还是 64 位整数。然后它使用没有两个后缀的类型。糟糕的文档。同样正如 cmets 对另一个答案所指出的那样,这部分在 VS2003 和 VS2010 之间发生了变化。
    • 请检查链接。有一个漂亮而明确的表。这可能是最近添加的,因为他们注意到他们的不良文档
    【解决方案3】:

    The documentation 说:

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

    【讨论】:

    • 这令人困惑。它没有两个后缀。它有一个 i 或 no i,以及一个 "" 或 64。
    • @vy32:您正在查看 Visual Studio 2003 文档,Mehrdad 正在查看 Visual Studio 2010 文档。
    • 啊。好吧,我认为 Visual Studio 2010 文档的问题在于他们假设您拥有现代运行时。我的程序需要能够在旧版 Windows 2000 系统上运行。
    • VS2010 文档是指 CRT 的 VS2010 版本。您使用 VS2003 文档是正确的。不过命名原则差不多,要wstati64版本。
    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2017-01-11
    相关资源
    最近更新 更多