В чем разница между struct __stat64 и struct _stati64 в WIN32?
Я работаю над кодом, который должен запускаться в каждой версии Windows начиная с WIN2000, а также должен работать с широкими путями к файлам.
Мне нужно назвать какой-то вариант stat
чтобы получить длину файла. Файл может быть больше, чем 4 ГБ.
Вот соответствующий раздел из документации MSDN Visual Studio .NET 2003[1]:
int _stat (const char * path, struct _stat * buffer); int _stat64 (const char * path, struct __stat64 * буфер); int _stati64( const char *path, struct _stati64 * буфер); int _wstat( const wchar_t * путь, struct _stat *buffer); int _wstat64( const wchar_t * путь, struct __stat64 * буфер); int _wstati64( const wchar_t * путь, struct _stati64 * буфер);
[1] http://msdn.microsoft.com/en-us/library/14h5k7ff(v=VS.71).aspx
Я не могу понять разницу между __stat64
структура и _stati64
состав. Я знаю, что я хочу использовать _wstat64
или же _wstati64
но MSDN молчит о том, что лучше.
Какие-либо предложения?
3 ответа
Вот структуры __stat64 и _stati64 из mingw wchar.h #include
файл:
#iffined (__MSVCRT__) struct _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 struct __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
так как:
st_mode
является_mode_t
и неunsigned short
- Время выражается как
_time64_t
и неtime_t
таким образом, он имеет тот же диапазон, который может быть выражен файловой системой NTFS, и не ограничен 32-разряднымtime_t
,
Я все еще в замешательстве, но это кажется ближе к правильному ответу.
Обратите внимание также, что _stat64
требует MSVCRT_VERSION
> 0x0601
Это означает, что он более современный.
Я не уверен на 100%, но это выглядит так:
stat
: 32-битная временная метка, 32-битный размер файлаstat64
: 64-битная временная метка, 32-битный размер файлаstati64
: 64-битная временная метка, 64-битный размер файла
Так что вам нужно wstati64
,
Это из следующих параграфов на MSDN:
Отметка даты в файле может быть представлена, если она более поздняя, чем полночь, 1 января 1970 года и до 19:14:07 18 января 2038 года, UTC, если вы не используете
_stat64
или же_wstat64
, в этом случае дата может быть представлена до 23:59:59, 31 декабря, 3000 UTC.
а также
st_size
Размер файла в байтах; 64-разрядное целое число для_stati64
а также_wstati64
В документации сказано:
Первый числовой суффикс (
32
или же64
) указывает размер используемого типа времени; второй суффикс либоi32
или жеi64
указывает, представлен ли размер файла как 32-разрядное или 64-разрядное целое число.