2

我的代码看起来接近这个:

  1. 大量使用普通 C++ IO 流插入的写入,例如steram << "foo";
  2. stream.flush();在某一点;
  3. _stat()在上面刷新之后立即调用MSVC C API 。

我观察到的是_stat()调用返回的尺寸不同于stream.tellp()较小的尺寸。

如果我stream在调用_stat()函数之前关闭它,它会返回正确的结果。我已经进入了_stat(),它用于FindFirstFileEx()获取尺寸。

这是一个已知的 Win32 API 怪癖吗?

4

3 回答 3

2

我假设您正在使用 Windows Vista 或更高版本。每次将文件刷新到光盘时,都会在 XP 下的文件属性中更新文件大小。这在 Vista 上不再适用,因为 Hans 已经对文件属性进行了注释,并且在文件的最后一个句柄关闭时会更新其大小。

有关更多详细信息,请参阅旧新事物博客

您可以尝试再次打开文件并关闭它。

于 2012-06-24T09:40:03.877 回答
1

使用 GetFileInformationByHandle 获取确切大小。

于 2012-06-24T09:19:50.947 回答
0

这可能是由于文件系统缓存造成的。从 C++ 流的角度来看,它已按照标准的要求将所有写入的数据传递到物理设备。但是文件系统可能会缓存写入,并根据其他一些策略刷新它们。

一种可能的解决方案是使用以下 Win32 API 选项之一:

  1. 如果您碰巧自己打开文件,请使用CreateFile,使用FILE_FLAG_NO_BUFFERINGFILE_FLAG_WRITE_THROUGH标志。
  2. 完成写入后,调用FlushFileBuffers以确保刷新元数据(您必须以某种方式获取文件的句柄)。

假设您的 C++ 流正在做自己的缓冲,这不应该对性能造成太大影响。

于 2012-06-22T12:00:50.480 回答