IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

获取文件大小之前最好先读一下这个文件

snnn的blog 2012-08-17 13:21:30 累计浏览 1,859 次
本机暂存

Windows下用stat函数得到的文件size可能不准
 

下面这段测试代码用于在TEMP目录下创建一个文件,然后随便写入一点数据

char* tempdir=getenv("TEMP");
std::ostringstream oss;
oss<<tempdir<<"\\1.txt";   
std::string filename=oss.str();
FILE* f=fopen(filename.c_str(),"wb");
char buf[]="abcdfdfdf";
fwrite(buf,1,sizeof(buf),f);
fflush(f);   
Sleep(10000000);
fclose(f);如果你有VC,可以编译试一下。运行这段代码,然后开一个命令行窗口,用dir命令获取这个文件的大小。

D:\Users\cm>dir %TEMP%\1.txt

在我机器上(Windows 7 64bit),每次的测试结果都是发现这个文件的大小是0。如果你自己写一个程序,用_stat(或FindFirstFileEx)函数去拿文件大小,发现也是0。

但是,如果,此时对这个文件做一点读操作,比如用more命令查看下这个文件,然后再获取文件大小,那么就一切正常了。

发现这个问题是因为,我在用leveldb的时候,发现虽然我通过fwrite函数写了log文件,然后flush了,但是接着用_stat函数去拿文件大小的时候,文件大小是0。而碰巧,跑TESTS的目录恰好在%TEMP%目录下,否则也不会这么糟了。

解决办法:用GetFileSizeEx获取文件大小,而不是_stat。

§4321 · August 15, 2012 · C/C++ · · [Print]

--------------------------------------------------------------------------------

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. Emacs安装配置 (累计阅读 8,370)
  2. 有道面试总结 (累计阅读 7,054)
  3. malloc()之后,内核发生了什么? (累计阅读 6,402)
  4. 使用scp在windows和Linux之间互传文件 (累计阅读 5,367)
  5. 为什么国内还有那么多网站使用.NET架构? (累计阅读 5,243)
  6. Git安装使用手记 (累计阅读 5,051)
  7. 如何在Windows下编译或调试MySQL (累计阅读 4,671)
  8. nodejs教程:配置nodejs.exe的windows目录结构 (累计阅读 4,666)
  9. windows命令行查看端口和进程信息,解决端口占用现象 (累计阅读 4,594)
  10. 编程珠玑番外篇之番外篇-N 答 UNIX 痛恨者王垠 (累计阅读 4,487)