当我想从Linux移植到Windows时。我发现Windows和Linux API都有stat.h,但有一些不同。问题是Windowsstat.h没有st_blksize变量,但Linux有。我真的不明白st_blksize还能做什么。有人能帮我科普这个问题吗?如何找到st_blksize的等效变量在Windows上?
eyh26e7m1#
对于Linux结构体定义,请转到此处:http://pubs.opengroup.org/onlinepubs/7908799/xsh/sysstat.h.html主要摘录如下:
st_size
st_blksize
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
st_blksize * st_blocks
#ifdef
编辑以响应IInspectable:
Windows上的块大小应为512,但如果需要验证,可以使用here中的GetDriveGeometry函数获取DISK_GEOMETRY*。DISK_GEOMETRY的BytesPerSector会给予你相当于st_blksize的值。注意GetDriveGeometry的使用CreateFileW对于大多数应用程序来说是不必要的,所以你可以用CreateFile替换它,并调整GetDriveGeometry,使其只接受一个好的旧ASCII路径。如果你仍然需要得到st_blocks,你可以从st_size除以BytesPerSector的上限得到。
GetDriveGeometry
DISK_GEOMETRY*
DISK_GEOMETRY
BytesPerSector
CreateFileW
CreateFile
编辑以根据Filesystem TS进行更新:
对于典型的编程应用程序来说,所需要的只是文件的大小。Filesystem TS现在提供了一种跨平台的方式来获取file_size的文件大小。
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
experimental/filesystem
72qzrwbm2#
我知道这个问题已经很老了,但是没有人提到FILE_STORAGE_INFO结构及其“PhysicalBytesPerSectorForAtomicity”和“PhysicalBytesPerSectorForPerformance”字段,这些字段可能(也许是?idk)很有用,可以回答这个问题。我很不确定,但是由于cppreference声明“最佳块大小”是st_blksize,我真的很想知道这是否是最接近的WIN API等价物之一。(Of当然,如果我错了,请告诉我,我没有足够的声誉来写这篇评论,但我仍然认为这是写这篇评论的好地方)
2条答案
按热度按时间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_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
的文件大小。不幸的是
experimental/filesystem
直到GCC 5.3才被包含,然而由于文件系统TS“直接基于boost.filesystem”,在Boost中的实验可能是一种替代方案:http://coliru.stacked-crooked.com/a/7b143609e692277472qzrwbm2#
我知道这个问题已经很老了,但是没有人提到FILE_STORAGE_INFO结构及其“PhysicalBytesPerSectorForAtomicity”和“PhysicalBytesPerSectorForPerformance”字段,这些字段可能(也许是?idk)很有用,可以回答这个问题。
我很不确定,但是由于cppreference声明“最佳块大小”是st_blksize,我真的很想知道这是否是最接近的WIN API等价物之一。
(Of当然,如果我错了,请告诉我,我没有足够的声誉来写这篇评论,但我仍然认为这是写这篇评论的好地方)