Windows上获取文件大小的几种方法及获取文件夹大小方法
2016-11-17 22:12
579 查看
获取文件大小
Windows提供了好几个API函数来获取文件大小,还可以使用标准C和标准C++库函数来获取(当然了,标准库函数的底层实现也是调用了Windows API函数,效率上可能有所影响)。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 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(); }
获取文件夹大小
通过遍历文件夹下面的文件,累加计算最后的总大小。__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; }
相关文章推荐
- WINDOWS 下 VC获取文件大小的几种方法(转)
- Windows开发--获取文件大小及获取文件夹大小的方法
- 获取文件大小的几种方法
- php在Windows下获取文件夹和大文件大小
- android获取、计算文件夹和文件大小的方法
- java获取文件大小的几种方法
- linux获取文件大小的几种方法
- C++获取文件大小的几种方法
- C#获取文件夹及文件的大小与占用空间的方法
- 获取文件大小的几种方法
- C#获取文件夹及文件的大小与占用空间的方法
- 获取文件夹大小的java类,通过类名调用方法,可直接获取文件大小
- VC-获取文件夹中的指定类型的所有文件名和文件大小
- C/C++获取文件大小的多种方法
- Windows中获取MAC地址的几种方法
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)(一)
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)(一)
- Linux下获取文件大小的方法
- 从linux 系统 中获取 windows系统的文件的 一种方法
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)