首页 > 编程知识 正文

file类获取文件大小,windows文件夹有多大

时间:2023-05-05 06:04:39 阅读:261259 作者:4319

文章来自:https://blog.csdn.net/mfcing/article/details/53184921获取文件大小

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

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

获取文件夹大小

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

[cpp]  view plain  copy __int64 GetFolderSize(const wstring& strDir)  {      __int64 nSize = 0;      wstring strRootPath = strDir + L"\";      wstring strRoot = strRootPath + L"*.*";      WIN32_FIND_DATA fd;      HANDLE hFind = FindFirstFile(strRoot.c_str(), &fd);      if (INVALID_HANDLE_VALUE == hFind)          return nSize;      while (FindNextFile(hFind, &fd))      {          if (wcscmp(fd.cFileName, L".") == 0 || wcscmp(fd.cFileName, L"..") == 0)              continue;          wstring strPath = strRootPath + fd.cFileName;          if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)              nSize += GetFolderSize(strPath);          else          {              HANDLE hFile = CreateFile(strPath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);              if (INVALID_HANDLE_VALUE == hFile)                  continue;              LARGE_INTEGER size;              if (::GetFileSizeEx(hFile, &size))              {                  nSize += size.QuadPart;              }              CloseHandle(hFile);          }      }      FindClose(hFind);      return nSize;  }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。