在Windows中获取文件大小

6

我找到了这个函数GetFileSizeEx(),它返回一个由结构体组成的PLARGE_INTEGER类型的文件大小。

typedef union _LARGE_INTEGER {
  struct {
    DWORD LowPart;
    LONG  HighPart;
  } ;
  struct {
    DWORD LowPart;
    LONG  HighPart;
  } u;
  LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER;

这是否与我称其为“结构的结构”相同?如何确定它返回的文件大小以及它可处理多大的信息量?

2个回答

5
您可能误解了union的含义。文件的长度可以通过以下方式获得:
LARGE_INTEGER  len_li;
GetFileSizeEx (hFile, &len_li);
int64 len = (len_li.u.HighPart << 32) | len_li.u.LowPart;

另外,使用现代编译器,您可以直接访问64位表示:

LARGE_INTEGER  len_li;
GetFileSizeEx (hFile, &len_li);
LONGLONG  len_ll = len_li.QuadPart;

这种情况感觉像是未定义行为。只有通过最后一次写入的成员读取联合体才是有效的。你怎么知道 QuadPart 是最后一个成员? - Kerrek SB
@Kerrek,在这种情况下,联合的目的是以不同的方式解释相同的数据。因此,写入一个联合成员并从另一个成员读取是合法的。 - Branko Dimitrijevic
@Branko:如何制定目的合法代码?如果我的双重释放的目的是确保变量真正消失,那么这样做是否可以?我相信唯一定义的乱序联合访问是其中一个成员是char数组。 - Kerrek SB
@Kerrek SB:这个特定的联合体提供了多种访问完全相同数据布局的方法,因此访问任何特定成员都没有问题。你所暗示的是被认为是联合体(滥用),其中存储在联合体中的数据类型基于其他地方的上下文而变化。例如,脚本解释器可能有一个联合体,根据另一个字段给出的当前数据类型,保存当前的“字符串”、“整数”或“浮点”值。 - wallyk
2
@KerrekSB:它能够工作,是因为创建这个union的公司还创建了一个编译器来编译这个union并定义所需的行为。也就是说,它的功能不是由一组合作的编译器构建者(ISO WG21)定义的,而是由单个构建者定义的。 - MSalters
显示剩余2条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接