C语言 “st_块大小”:不是Windows上“stat”的成员

q5lcpyga  于 2023-03-12  发布在  Windows
关注(0)|答案(2)|浏览(114)

当我想从Linux移植到Windows时。我发现Windows和Linux API都有stat.h,但有一些不同。问题是Windowsstat.h没有st_blksize变量,但Linux有。我真的不明白st_blksize还能做什么。有人能帮我科普这个问题吗?如何找到st_blksize的等效变量在Windows上?

eyh26e7m

eyh26e7m1#

对于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进行更新:

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

ofstream("foo.txt") << "lorem ipsum";
cout << experimental::filesystem::file_size("foo.txt") << endl; // Prints 11

不幸的是experimental/filesystem直到GCC 5.3才被包含,然而由于文件系统TS“直接基于boost.filesystem”,在Boost中的实验可能是一种替代方案:http://coliru.stacked-crooked.com/a/7b143609e6922774

72qzrwbm

72qzrwbm2#

我知道这个问题已经很老了,但是没有人提到FILE_STORAGE_INFO结构及其“PhysicalBytesPerSectorForAtomicity”和“PhysicalBytesPerSectorForPerformance”字段,这些字段可能(也许是?idk)很有用,可以回答这个问题。
我很不确定,但是由于cppreference声明“最佳块大小”是st_blksize,我真的很想知道这是否是最接近的WIN API等价物之一。
(Of当然,如果我错了,请告诉我,我没有足够的声誉来写这篇评论,但我仍然认为这是写这篇评论的好地方)

相关问题