В чем разница между 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 так как:

  1. st_mode является _mode_t и не unsigned short
  2. Время выражается как _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-разрядное целое число.

Другие вопросы по тегам