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

获取文件大小

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



  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 这个错误通常表示程序尝试访问的文件不存在或者无法访问。可能的原因包括: 1. 文件的路径写错了,或者程序所在的目录和文件不在同一目录下。 2. 文件被移动了位置或者被删除了。 3. 程序没有权限访问这个文件。 为了解决这个问题,可以尝试以下步骤: 1. 检查文件路径是否写错,确保文件存在并且程序有访问权限。 2. 如果文件被移动了位置,则修改程序中文件路径的引用。 3. 如果文件被删除了,则重新下载或者恢复文件。 4. 如果程序没有权限访问文件,则需要修改文件的访问权限或者在运行程序时使用管理员权限。 ### 回答2: 出现"FileNotFoundError: [WinError 2] 系统找不到指定的文件。: '$RECYCLE.BIN'。"错误的原因是系统无法找到指定的文件"$RECYCLE.BIN"。 "$RECYCLE.BIN"是一个系统文件夹,用于存放被删除的文件和文件夹。当我们在Windows操作系统中删除一个文件或文件夹时,它们不会立即从硬盘上删除,而是被移动到"$RECYCLE.BIN"文件夹中,以便在需要时可以恢复。 然而,有时候当我们尝试访问"$RECYCLE.BIN"时,会遇到该错误。这可能是因为该文件夹被误删除、移动、重命名或被其他程序访问等原因。 要解决这个问题,有以下几种方法可以尝试: 1. 使用命令提示符运行磁盘错误检查工具(chkdsk)。打开命令提示符,输入"chkdsk C: /f"(如果"$RECYCLE.BIN"位于C盘),然后按下回车键。等待磁盘错误检查工具完成,它会尝试修复任何与文件系统相关的问题。 2. 检查是否已经彻底删除了"$RECYCLE.BIN"文件夹。在资源管理器中,右键单击桌面上的回收站图标,选择“属性”。确保“驱动器属性”对话框中的“自定义回收站大小”选项已被禁用,然后点击“确定”。 3. 检查是否有第三方安全软件或系统优化工具可能会干扰"$RECYCLE.BIN"文件夹的访问。禁用或卸载这些软件,然后尝试再次访问"$RECYCLE.BIN"文件夹。 如果尝试了以上方法仍然无法解决问题,建议联系计算机技术支持团队或操作系统提供商寻求帮助。他们可能需要进一步调查并提供特定的解决方案。 ### 回答3: FileNotFoundError是一个Python错误,表示在指定的路径中找不到所需的文件。而[WinError 2]是指Windows操作系统中的错误代码,表示系统无法找到指定的文件。 在这个错误消息中,'$RECYCLE.BIN'表示指定文件的路径。'$RECYCLE.BIN'是Windows操作系统中的一个隐藏文件夹,用于存储回收站中的文件。回收站是一个用于暂时存放被删除文件的地方,可以恢复这些文件或者永久删除它们。 导致这个错误的原因可能是由于以下几种情况: 1. 指定的文件或文件夹不存在:可能是由于拼写错误或者路径错误导致的。在这种情况下,你需要检查路径是否正确,并确保指定的文件或文件夹存在。 2. 文件或文件夹被移动或删除:可能是由于你的操作或其他程序的操作导致指定的文件或文件夹被移动或删除了。在这种情况下,你需要找到文件的新位置或者从回收站中恢复文件。 3. 缺少访问权限:可能是由于对指定文件或文件夹的访问权限不足导致的。在这种情况下,你需要确保你有足够的权限来访问该文件或文件夹。 为了解决这个错误,你可以尝试以下方法: 1. 检查文件路径是否正确,并确保文件或文件夹存在。 2. 检查回收站文件夹是否被移动或删除,并尝试恢复文件。 3. 确保你有足够的权限来访问该文件或文件夹。 如果以上方法都不能解决问题,那么可能是其他软件或配置引起的问题。你可以尝试重新安装或更新相关软件,或者咨询技术支持来获取更多的帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值