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