C 我应该在Windows上使用GetFileSize或_stat64获取文件大小吗?

C 我应该在Windows上使用GetFileSize或_stat64获取文件大小吗?,c,windows,winapi,C,Windows,Winapi,为了在Windows上可靠地获取文件大小,我在SO上找到了两种解决方案:GetFileSize或\u stat64 每种方法的优缺点是什么 你是什么意思GetFileSizewinapi函数,该函数按原样返回文件大小。或者可以将GetFileInformationByHandleEx与FileStandardInfo一起使用,或者将ZwQueryInformationFile与FileStandardInformation一起使用(GetFileSize内部执行此操作)。\u stat64更糟。

为了在Windows上可靠地获取文件大小,我在SO上找到了两种解决方案:
GetFileSize
\u stat64


每种方法的优缺点是什么

你是什么意思
GetFileSize
winapi函数,该函数按原样返回文件大小。或者可以将
GetFileInformationByHandleEx
FileStandardInfo
一起使用,或者将
ZwQueryInformationFile
FileStandardInformation
一起使用(
GetFileSize
内部执行此操作)。
\u stat64
更糟。只有负数比较这个。但是在所有的内部方式中,我们调用
ZwQueryInformationFile
with
FileStandardInformation
stat()是一个posix函数。错误的操作系统,但受Microsoft CRT支持,posix曾经是Windows NT支持的api层之一。优点是不必包括大窗户。缺点是,它检索的信息不仅仅是文件大小,而且不是免费的,而且它必须将任何故障压缩到错误代码中。
GetFileSize
\u stat64
都严重依赖操作系统。前者在*ix上是无用的,我认为后者在Windows上是无用的。如果您想编写跨平台代码,那么在这种情况下,您必须使用道德上相当于
#ifdef
。如果你只关心Windows,我会继续使用
GetFileSize
。(“入乡随俗。”)
GetFileSize()
(及其后继者
GetFileSizeEx()
)将文件
句柄作为输入,因此它要求您首先实际打开文件
\u stat()
采用文件路径字符串,可以从文件系统的元数据中获取大小,而无需打开文件。与之相当的Win32是
FindFirstFile/Ex()
GetFileAttributesEx(getfileexinfo标准)
(两者都返回的不仅仅是文件大小)@RemyLebeau,文件大小在所有情况下都是文件系统元数据。但是
FindFirstFile[Ex]W
(即
NtQueryDirectoryFile[Ex]
)查询父目录,因为性能原因,它可能会像NTFS一样维护一组有限的单独更新的元数据。目录中的元数据,尤其是上次写入和上次访问时间戳,并不总是与文件记录本身中的元数据同步。