'st_blksize' : 不是 Windows 上 'stat' 的成员
'st_blksize' : is not a member of 'stat' on Windows
因为我想从 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 块大小。在某些文件系统类型中,这可能因文件而异
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:
对于典型的编程应用程序,所需要的只是文件的大小。文件系统 TS 现在提供了一种跨平台的方式来以 file_size
.
的形式获取文件大小
ofstream("foo.txt") << "lorem ipsum";
cout << experimental::filesystem::file_size("foo.txt") << endl; // Prints 11
可惜experimental/filesystem
, however since the Filesystem TS "is directly based on boost.filesystem," experimentation in Boost may be an alternative: http://coliru.stacked-crooked.com/a/7b143609e6922774
因为我想从 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 块大小。在某些文件系统类型中,这可能因文件而异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:
对于典型的编程应用程序,所需要的只是文件的大小。文件系统 TS 现在提供了一种跨平台的方式来以 file_size
.
ofstream("foo.txt") << "lorem ipsum";
cout << experimental::filesystem::file_size("foo.txt") << endl; // Prints 11
可惜experimental/filesystem