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

时间:2015-01-06 09:47:52

标签: c linux windows port

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

1 个答案:

答案 0 :(得分:3)

对于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_GEOMETRY' BytesPerSector将为您提供相当于st_blksize的内容。

请注意,对于大多数应用程序来说,GetDriveGeometry使用CreateFileW是不必要的。因此,您可以将其替换为CreateFile并将GetDriveGeometry调整为仅接受旧的ASCII路径。

如果您仍然需要st_blocks,则可以从st_size的上限BytesPerSector获得此结果。

编辑以更新Filesystem TS

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

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

不幸的是experimental/filesystem will not be included until GCC 5.3,因为文件系统TS&#34;直接基于boost.filesystem,&#34; Boost中的实验可能是另一种选择:http://coliru.stacked-crooked.com/a/7b143609e6922774