В чем разница между struct __stat64 и struct _stati64 в WIN32? - PullRequest
4 голосов
/ 04 июля 2011

Я работаю над кодом, который должен запускаться в каждой версии 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 *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 молчит, что лучше .

Есть предложения?

Ответы [ 3 ]

4 голосов
/ 04 июля 2011

Я не уверен на 100%, но похоже, что:

  • stat: 32-битная метка времени, размер файла 32-бит
  • stat64: 64-метка времени, 32-битный размер файла
  • stati64: метка времени в 64-битном формате, размер файла 64-бит

Так что вам понадобится wstati64.

Thisиз следующих параграфов в MSDN:

Отметка даты в файле может быть представлена, если она более поздняя, ​​чем полночь, 1 января 1970 года и до 19:14:07 18 января 2038 года, UTCесли вы не используете _stat64 или _wstat64, в этом случае дата может быть представлена ​​до 23:59:59, 31 декабря 3000, UTC.

и

st_size Размер файла в байтах;64-разрядное целое число для _stati64 и _wstati64

3 голосов
/ 04 июля 2011

Вот структуры __stat64 и _stati64 из файла mingw wchar.h #include:


#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потому что:

  1. st_mode равно _mode_t, а не unsigned short
  2. Время выражается как _time64_t, а не time_t, поэтому оно имеет тот же диапазонэто может быть выражено файловой системой NTFS и не ограничено 32-битным time_t.

Я все еще в замешательстве, но это кажется ближе к правильному ответу.

Обратите также внимание, что _stat64 требует MSVCRT_VERSION> 0x0601, что подразумевает, что оноболее современный.

0 голосов
/ 04 июля 2011

Документация гласит:

Первый числовой суффикс (32 или 64) указывает размер используемого типа времени; второй суффикс: i32 или i64, указывающий, представлен ли размер файла в виде 32-разрядного или 64-разрядного целого числа .

...