文章来自:https://blog.csdn.net/mfcing/article/details/53184921

获取文件大小

Windows提供了好几个API函数来获取文件大小,还可以使用标准C和标准C++库函数来获取(当然了,标准库函数的底层实现也是调用了Windows API函数,效率上可能有所影响)。

[cpp]  view plain copy
  1. const wchar_t* pFile = L"C:\\chromium.tar";//文件大小9,332,330,496 字节 32位整形无法装下
  2. HANDLE hFile = CreateFile(pFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  3. if (INVALID_HANDLE_VALUE != hFile)
  4. {
  5. //方法一,使用Windows API GetFileSizeEx
  6. LARGE_INTEGER size;
  7. ::GetFileSizeEx(hFile, &size);
  8. __int64 nSize1 = size.QuadPart;
  9. //方法二,使用Windows API GetFileSize
  10. DWORD dwHigh = 0;
  11. DWORD dwSize = ::GetFileSize(hFile, &dwHigh);
  12. __int64 nSize2 = ((__int64)dwHigh << 32) + dwSize;//对于大文件需要将高32位和低32位拼接成64位整形
  13. CloseHandle(hFile);
  14. //方法三,使用Windows API GetFileAttributesEx<span style="color:#ff6666;">
  15. </span>     WIN32_FILE_ATTRIBUTE_DATA fileAttr;
  16. GetFileAttributesEx(pFile, GetFileExInfoStandard, &fileAttr);
  17. __int64 nSize3 = ((__int64)fileAttr.nFileSizeHigh << 32) + fileAttr.nFileSizeLow;
  18. //确定三种发发读取的文件大小一致
  19. assert(nSize1 == nSize2 && nSize2 == nSize3);
  20. }
  21. //方法四,使用标准C库函数实现
  22. FILE* fp = NULL;
  23. _wfopen_s(&fp, pFile, L"r");
  24. if (fp)
  25. {
  26. _fseeki64(fp, 0, SEEK_END); //移动指针到文件末尾
  27. __int64 nSize4 = _ftelli64(fp);//获取文件大小。不要使用ftell,文件太大时32位整形会被截断
  28. _fseeki64(fp, 0, SEEK_SET); //移动文件指针到原来的位置(复原)
  29. //.........do something
  30. fclose(fp);
  31. }
  32. //方法五,使用标准C++库函数实现
  33. fstream ffile;
  34. ffile.open(pFile, ios::in | ios::binary | ios::_Nocreate);
  35. if (ffile.is_open())
  36. {
  37. ffile.seekg(0, ffile.end);
  38. __int64 fileSize = ffile.tellg();
  39. ffile.close();
  40. }

获取文件夹大小

通过遍历文件夹下面的文件,累加计算最后的总大小。

[cpp]  view plain copy
  1. __int64 GetFolderSize(const wstring& strDir)
  2. {
  3. __int64 nSize = 0;
  4. wstring strRootPath = strDir + L"\\";
  5. wstring strRoot = strRootPath + L"*.*";
  6. WIN32_FIND_DATA fd;
  7. HANDLE hFind = FindFirstFile(strRoot.c_str(), &fd);
  8. if (INVALID_HANDLE_VALUE == hFind)
  9. return nSize;
  10. while (FindNextFile(hFind, &fd))
  11. {
  12. if (wcscmp(fd.cFileName, L".") == 0 || wcscmp(fd.cFileName, L"..") == 0)
  13. continue;
  14. wstring strPath = strRootPath + fd.cFileName;
  15. if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  16. nSize += GetFolderSize(strPath);
  17. else
  18. {
  19. HANDLE hFile = CreateFile(strPath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  20. if (INVALID_HANDLE_VALUE == hFile)
  21. continue;
  22. LARGE_INTEGER size;
  23. if (::GetFileSizeEx(hFile, &size))
  24. {
  25. nSize += size.QuadPart;
  26. }
  27. CloseHandle(hFile);
  28. }
  29. }
  30. FindClose(hFind);
  31. return nSize;
  32. }

Windows上获取文件大小的几种方法及获取文件夹大小方法相关推荐

  1. java 创建文件夹的方法_Java创建文件夹的方法

    Java创建文件夹的方法 /** * 用于创建文件夹的方法 * @param mkdirName */ public void mkdir(String mkdirName) { try { File ...

  2. python os获取文件大小_Python3基础 os.path.getsize 获得文件的大小

    Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda : 4.5.11 typesetting : Markdown ...

  3. 三种C/C++创建文件夹的方法

    第一种: 调用MFC封装好的接口函数,主要会用到 PathIsDirectory //判断是否存在 ::CreateDirectory //创建 例如: #include "shlwapi. ...

  4. Windows查看当前目录下所有文件夹大小方法

    用法,下载附件里面所提供的bat脚本,(加上后缀名.bat即可)放到要查看的目录下面,然后在当前目录下执行命令行: @echo off IF [%1]==[] GOTO USAGE if NOT ex ...

  5. linux 文件大小总和,linux磁盘占用跟每个文件夹大小总和不符?

    我们在使用磁盘统计的时候,经常用到df和度命令, 但是很多时候都发现不太一致.其实主要分下面两类情况 一.僵尸进程 通过top命令可以统计僵尸进程: image.png 也可以通过以下命令进行操作 p ...

  6. 文件夹加密码的方法有哪些?文件夹加密方法盘点

    在我们使用电脑的过程中,我们会将一些重要的数据放入文件夹内进行统一管理,为了保护数据安全,文件夹加密码通常是一个不错的选择.那么文件夹该怎么加密码呢?电脑文件夹加密码的方法有哪些呢? 文件夹加密码方法 ...

  7. python_获取文件及文件夹大小修改时间

    获取文件大小 关键函数是 os.path.getsize(file) 获取文件夹大小 没有直接的函数,但是可以通过遍历文件夹,将每个文件的大小叠加 关键函数 for root, dirs, files ...

  8. java中比较两个文件的大小_Java实现获取文件大小的几种方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 目前Java获取文件大小的方法有两种: 1.通过file的length()方法获取: 2.通过流式方法获取: 通过流式方法又有两种,分别是旧的java.i ...

  9. java中测长度的方法,java获取文件大小的几种方法

    目前java获取文件大小的方法有两种: 1.通过file的length()方法获取: 2.通过流式方法获取: 通过流式方法又有两种,分别是旧的java.io.*中fileinputstream的ava ...

最新文章

  1. Laravel之Eloquent ORM访问器调整器及属性转换
  2. 配置Cassandra开机启动(CentOS 7)
  3. 引导界面(四)仿人人网V5.9.2最新版引导界面
  4. Java用TCP手写聊天室 可以 私聊版加群聊版
  5. Java基础知识强化之网络编程笔记05:UDP之多线程实现聊天室案例
  6. oracle没用过元数据,案例:Oracle RAC asm备份元数据之md_backup和md_restore 好处与
  7. linux文件末尾 m,Linux7-删除nginx配置文件末尾的^M字符
  8. [原] Android快速开发框架-AndroidFine,GitHub开源
  9. 云数据库MySQL的发展史
  10. sap的工作日历_ABAP-有关日期的SAP函数使用(日历)
  11. 数据分析需要学习的技能有哪些?
  12. ORA-01455: converting column overflows integer datatype
  13. ES6代码转为ES5代码babel在线转换
  14. MySQL忘记密码,如何重置
  15. SQL Prompt 4试用
  16. 云计算机教室布置图,图解:颠覆传统 带你走进升腾云教室
  17. 2021-2022 ACM-ICPC Latin American Regional Programming Contest
  18. 慕容话币:币圈投资缺点无处遁形,保持良好的心态有多难?
  19. SpringBoot 优雅实现动态数据源切换配置
  20. STM32F103C8T6接入机智云平台,实现器件多点操控

热门文章

  1. 名帖117 祝允明 小楷《东坡记游卷》
  2. 服务器系统eos升级,佳能EOS R固件更新,自动对焦功能升级
  3. Java String源码阅读
  4. 软工网络15团队作业1——团队组队展示
  5. 高德地图浏览器精确定位
  6. 现代c++:MacOS VSCode配置c++17环境
  7. linux启动进入bios设置密码,通过bios怎么设置开机密码
  8. 2019中山大学计算机考研人数,中山大学2019年考研报录比
  9. [AUI] Liferay AUI editable的使用
  10. 使用主从盘互备做服务器