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

文章来自: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.   
  10.         //方法二,使用Windows API GetFileSize  
  11.         DWORD dwHigh = 0;  
  12.         DWORD dwSize = ::GetFileSize(hFile, &dwHigh);  
  13.         __int64 nSize2 = ((__int64)dwHigh << 32) + dwSize;//对于大文件需要将高32位和低32位拼接成64位整形  
  14.         CloseHandle(hFile);  
  15.   
  16.         //方法三,使用Windows API GetFileAttributesEx<span style="color:#ff6666;">  
  17. </span>     WIN32_FILE_ATTRIBUTE_DATA fileAttr;  
  18.         GetFileAttributesEx(pFile, GetFileExInfoStandard, &fileAttr);  
  19.         __int64 nSize3 = ((__int64)fileAttr.nFileSizeHigh << 32) + fileAttr.nFileSizeLow;  
  20.   
  21.         //确定三种发发读取的文件大小一致  
  22.         assert(nSize1 == nSize2 && nSize2 == nSize3);  
  23.     }  
  24.   
  25.     //方法四,使用标准C库函数实现  
  26.     FILE* fp = NULL;  
  27.     _wfopen_s(&fp, pFile, L"r");  
  28.     if (fp)  
  29.     {  
  30.         _fseeki64(fp, 0, SEEK_END); //移动指针到文件末尾  
  31.         __int64 nSize4 = _ftelli64(fp);//获取文件大小。不要使用ftell,文件太大时32位整形会被截断  
  32.         _fseeki64(fp, 0, SEEK_SET); //移动文件指针到原来的位置(复原)  
  33.         //.........do something  
  34.         fclose(fp);  
  35.     }  
  36.   
  37.     //方法五,使用标准C++库函数实现  
  38.     fstream ffile;  
  39.     ffile.open(pFile, ios::in | ios::binary | ios::_Nocreate);  
  40.     if (ffile.is_open())  
  41.     {  
  42.         ffile.seekg(0, ffile.end);  
  43.         __int64 fileSize = ffile.tellg();  
  44.         ffile.close();  
  45.     }  

获取文件夹大小

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

[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;  

猜你喜欢

转载自blog.csdn.net/u011269801/article/details/80771037