文章来自:https://blog.csdn.net/mfcing/article/details/53184921
获取文件大小
Windows提供了好几个API函数来获取文件大小,还可以使用标准C和标准C++库函数来获取(当然了,标准库函数的底层实现也是调用了Windows API函数,效率上可能有所影响)。
- constwchar_t*pFile=L"C:\\chromium.tar";//文件大小9,332,330,496字节32位整形无法装下
- HANDLEhFile=CreateFile(pFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
- if(INVALID_HANDLE_VALUE!=hFile)
- {
- //方法一,使用WindowsAPIGetFileSizeEx
- LARGE_INTEGERsize;
- ::GetFileSizeEx(hFile,&size);
- __int64nSize1=size.QuadPart;
- //方法二,使用WindowsAPIGetFileSize
- DWORDdwHigh=0;
- DWORDdwSize=::GetFileSize(hFile,&dwHigh);
- __int64nSize2=((__int64)dwHigh<<32)+dwSize;//对于大文件需要将高32位和低32位拼接成64位整形
- CloseHandle(hFile);
- //方法三,使用WindowsAPIGetFileAttributesEx<spanstyle="color:#ff6666;">
- </span>WIN32_FILE_ATTRIBUTE_DATAfileAttr;
- GetFileAttributesEx(pFile,GetFileExInfoStandard,&fileAttr);
- __int64nSize3=((__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);//移动指针到文件末尾
- __int64nSize4=_ftelli64(fp);//获取文件大小。不要使用ftell,文件太大时32位整形会被截断
- _fseeki64(fp,0,SEEK_SET);//移动文件指针到原来的位置(复原)
- //.........dosomething
- fclose(fp);
- }
- //方法五,使用标准C++库函数实现
- fstreamffile;
- ffile.open(pFile,ios::in|ios::binary|ios::_Nocreate);
- if(ffile.is_open())
- {
- ffile.seekg(0,ffile.end);
- __int64fileSize=ffile.tellg();
- ffile.close();
- }
获取文件夹大小
通过遍历文件夹下面的文件,累加计算最后的总大小。
- __int64GetFolderSize(constwstring&strDir)
- {
- __int64nSize=0;
- wstringstrRootPath=strDir+L"\\";
- wstringstrRoot=strRootPath+L"*.*";
- WIN32_FIND_DATAfd;
- HANDLEhFind=FindFirstFile(strRoot.c_str(),&fd);
- if(INVALID_HANDLE_VALUE==hFind)
- returnnSize;
- while(FindNextFile(hFind,&fd))
- {
- if(wcscmp(fd.cFileName,L".")==0||wcscmp(fd.cFileName,L"..")==0)
- continue;
- wstringstrPath=strRootPath+fd.cFileName;
- if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
- nSize+=GetFolderSize(strPath);
- else
- {
- HANDLEhFile=CreateFile(strPath.c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
- if(INVALID_HANDLE_VALUE==hFile)
- continue;
- LARGE_INTEGERsize;
- if(::GetFileSizeEx(hFile,&size))
- {
- nSize+=size.QuadPart;
- }
- CloseHandle(hFile);
- }
- }
- FindClose(hFind);
- returnnSize;
- }