您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: