因为我想从 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 block 大小。在某些文件系统类型中,这可能因文件而异st_blocks
:为此对象分配的 block 数
对于常规文件,很明显 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 上的 block 大小应为 512,但如果您需要验证,可以使用 here 中的 GetDriveGeometry
函数获取 DISK_GEOMETRY*
。
DISK_GEOMETRY
的 BytesPerSector
将为您提供相当于 st_blksize
的值。
注意 GetDriveGeometry
对 CreateFileW
的使用对于大多数应用程序来说是不必要的。所以你可以用 CreateFile
代替它并调整 GetDriveGeometry
以仅接受良好的旧 ASCII 路径。
如果您仍然需要获取 st_blocks
,您可以从 BytesPerSector
的 st_size
上限获取。
编辑更新关于 Filesystem TS :
对于典型的编程应用程序,所需要的只是文件的大小。文件系统 TS 现在提供了一种跨平台的方式来以 file_size
的形式获取文件大小。 .
ofstream("foo.txt") << "lorem ipsum";
cout << experimental::filesystem::file_size("foo.txt") << endl; // Prints 11
不幸的是实验/文件系统
will not be included until GCC 5.3 ,但是由于 Filesystem TS“直接基于 boost.filesystem”,在 Boost 中进行实验可能是一个替代方案:http://coliru.stacked-crooked.com/a/7b143609e6922774
关于c - 'st_blksize' : is not a member of 'stat' on Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27796000/