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

标签 c linux windows porting

因为我想从 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_blksizest_blocks 一起工作的东西。 或者您最好在代码中的任何地方都使用 st_size

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

编辑以回应 IInspectable :

Windows 上的 block 大小应为 512,但如果您需要验证,可以使用 here 中的 GetDriveGeometry 函数获取 DISK_GEOMETRY*

DISK_GEOMETRYBytesPerSector 将为您提供相当于 st_blksize 的值。

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

如果您仍然需要获取 st_blocks,您可以从 BytesPerSectorst_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/

相关文章:

c# - 在隔离存储中存储对象列表的问题

c# - Windows Phone 8.1 中的 Canvas 移动动画

c - C 中存储 char 的动态数组

c - OpenGL函数加载是如何工作的?

c - 使用 procfs 从内核读取时间戳 - 从内核读取后它存储在哪里?

c - 来自 X11 库的 Haskell fetchName 不返回窗口的名称

windows - 监控您自己进程中的内存使用情况

c++ - C/C++。库相对于组合目标文件的优势

C数据结构库

linux - 非阻塞连接调用不返回连接被拒绝