'st_blksize' : 不是 Windows 上 'stat' 的成员

'st_blksize' : is not a member of 'stat' on Windows

因为我想从 Linux 移植到 windows。我意识到 Windows 和 Linux API 都有 stat.h 但有一些差异。问题是 Windows stat.h 没有 st_blksize 变量但是 Linux 有.我真的不明白 st_blksize 也可以做什么。谁能帮我解决这个问题?如何在 Windows 上找到 st_blksize 的等价物?

对于 Linux 结构定义,请转到此处:http://pubs.opengroup.org/onlinepubs/7908799/xsh/sysstat.h.html

主要摘录:

  • st_size:文件大小(以字节为单位)(如果文件是普通文件)
  • st_blksize:此对象特定于文件系统的首选 I/O 块大小。在某些文件系统类型中,这可能因文件而异
  • st_blocks:为此对象分配的块数

很明显 st_size 对于常规文件应该等于 st_blksize * st_blocks

对于您的跨平台代码,您需要 #ifdef 任何适用于 st_blksizest_blocks 的代码。 或者最好你可以在代码中的任何地方使用 st_size

进一步阅读:https://groups.google.com/forum/#!topic/comp.unix.programmer/7saTJ9gRBEM

编辑以响应 IInspectable

Windows 上的块大小应该是 512,但是如果您需要验证,可以使用 here 中的 GetDriveGeometry 函数来获得 DISK_GEOMETRY*

DISK_GEOMETRYBytesPerSector 会给你相当于 st_blksize.

注意 GetDriveGeometry 的使用 CreateFileW 对于大多数应用程序来说是不必要的。所以你可以用 CreateFile 替换它并调整 GetDriveGeometry 以接受一个好的旧 ASCII 路径。

如果你还需要得到st_blocks你可以从st_size的上限超过BytesPerSector得到这个。

编辑更新 Filesystem TS:

对于典型的编程应用程序,所需要的只是文件的大小。文件系统 TS 现在提供了一种跨平台的方式来以 file_size.

的形式获取文件大小
ofstream("foo.txt") << "lorem ipsum";
cout << experimental::filesystem::file_size("foo.txt") << endl; // Prints 11

可惜experimental/filesystem, however since the Filesystem TS "is directly based on boost.filesystem," experimentation in Boost may be an alternative: http://coliru.stacked-crooked.com/a/7b143609e6922774