首页 >图片操作 > 内容

Windows上获取文件大小的几种方法及获取文件夹大小方法

2023年9月30日 20:33

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

获取文件大小

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

  1. constwchar_t*pFile=L"C:\\chromium.tar";//文件大小9,332,330,496字节32位整形无法装下
  2. HANDLEhFile=CreateFile(pFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
  3. if(INVALID_HANDLE_VALUE!=hFile)
  4. {
  5. //方法一,使用WindowsAPIGetFileSizeEx
  6. LARGE_INTEGERsize;
  7. ::GetFileSizeEx(hFile,&size);
  8. __int64nSize1=size.QuadPart;
  9. //方法二,使用WindowsAPIGetFileSize
  10. DWORDdwHigh=0;
  11. DWORDdwSize=::GetFileSize(hFile,&dwHigh);
  12. __int64nSize2=((__int64)dwHigh<<32)+dwSize;//对于大文件需要将高32位和低32位拼接成64位整形
  13. CloseHandle(hFile);
  14. //方法三,使用WindowsAPIGetFileAttributesEx<spanstyle="color:#ff6666;">
  15. </span>WIN32_FILE_ATTRIBUTE_DATAfileAttr;
  16. GetFileAttributesEx(pFile,GetFileExInfoStandard,&fileAttr);
  17. __int64nSize3=((__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. __int64nSize4=_ftelli64(fp);//获取文件大小。不要使用ftell,文件太大时32位整形会被截断
  28. _fseeki64(fp,0,SEEK_SET);//移动文件指针到原来的位置(复原)
  29. //.........dosomething
  30. fclose(fp);
  31. }
  32. //方法五,使用标准C++库函数实现
  33. fstreamffile;
  34. ffile.open(pFile,ios::in|ios::binary|ios::_Nocreate);
  35. if(ffile.is_open())
  36. {
  37. ffile.seekg(0,ffile.end);
  38. __int64fileSize=ffile.tellg();
  39. ffile.close();
  40. }

获取文件夹大小

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

  1. __int64GetFolderSize(constwstring&strDir)
  2. {
  3. __int64nSize=0;
  4. wstringstrRootPath=strDir+L"\\";
  5. wstringstrRoot=strRootPath+L"*.*";
  6. WIN32_FIND_DATAfd;
  7. HANDLEhFind=FindFirstFile(strRoot.c_str(),&fd);
  8. if(INVALID_HANDLE_VALUE==hFind)
  9. returnnSize;
  10. while(FindNextFile(hFind,&fd))
  11. {
  12. if(wcscmp(fd.cFileName,L".")==0||wcscmp(fd.cFileName,L"..")==0)
  13. continue;
  14. wstringstrPath=strRootPath+fd.cFileName;
  15. if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
  16. nSize+=GetFolderSize(strPath);
  17. else
  18. {
  19. HANDLEhFile=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_INTEGERsize;
  23. if(::GetFileSizeEx(hFile,&size))
  24. {
  25. nSize+=size.QuadPart;
  26. }
  27. CloseHandle(hFile);
  28. }
  29. }
  30. FindClose(hFind);
  31. returnnSize;
  32. }


参考文章:https://blog.csdn.net/chunleixiahe/article/details/80771037

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时候联系我们修改或删除,在此表示感谢。

特别提醒:

1、请用户自行保存原始数据,为确保安全网站使用完即被永久销毁,如何人将无法再次获取。

2、如果上次文件较大或者涉及到复杂运算的数据,可能需要一定的时间,请耐心等待一会。

3、请按照用户协议文明上网,如果发现用户存在恶意行为,包括但不限于发布不合适言论妄图

     获取用户隐私信息等行为,网站将根据掌握的情况对用户进行限制部分行为、永久封号等处罚。

4、如果文件下载失败可能是弹出窗口被浏览器拦截,点击允许弹出即可,一般在网址栏位置设置

5、欢迎将网站推荐给其他人,网站持续更新更多功能敬请期待,收藏网站高效办公不迷路。

      



登录后回复

共有0条评论