我正在研究一些代码,这些代码需要在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保持沉默,更好。
有什么建议吗?
答案 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。
和
<强>
的64位整数_wstat64
强> 文件大小(以字节为单位);st_size
和_stati64
答案 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
更好的选择,因为:
st_mode
为_mode_t
而非unsigned short
_time64_t
而不是time_t
,因此它具有可以由NTFS文件系统表示的相同范围,并且不会削弱为32位{{1 }}。 我仍然感到困惑,但这似乎更接近正确答案。
另请注意time_t
需要_stat64
&gt; MSVCRT_VERSION
,这意味着它更现代化。
答案 2 :(得分:0)
第一个数字后缀(
32
或64
)表示所用时间类型的大小; 第二个后缀是i32
或i64
,表示文件大小是表示为32位还是64位整数。< / p>