查询一个文件夹目录的大小

非递归计算文件夹大小

前几天看到一个试用递归方式求解文件夹目录大小的代码,但是在实际项目使用中一般去避免使用递归,因为这样是比较耗时的,因此我将此代码改为了非递归方式。


//递归方式
ULONGLONG GetDirFileSize( LPCTSTR strDir )
{
	TCHAR szFilePath[ MAX_PATH ] = { 0 };
	wcsncpy( szFilePath, strDir, MAX_PATH );
	PathAppend( szFilePath, _T( "\\*.*" ) );

	WIN32_FIND_DATA fd = { 0 };
	HANDLE hFileFind = FindFirstFile( szFilePath, &fd );
	ULONGLONG dwSize = 0;
	if( INVALID_HANDLE_VALUE == hFileFind )
	{
		return 0;
	}
	do 
	{
		if( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
		{
			//Is Dir 并且非 ./.. 文件夹目录
			if(  StrCmpI( fd.cFileName, _T( "." ) ) && StrCmpI( fd.cFileName, _T( ".." ) ) )
			{
				TCHAR szTmpPath[ MAX_PATH ] = { 0 };
				wcsncpy( szTmpPath, strDir, MAX_PATH );
				PathAppend( szTmpPath, fd.cFileName );
				dwSize += GetDirFileSize( szTmpPath );
			}
		}
		else
		{
			dwSize += ( (ULONGLONG)(fd.nFileSizeHigh) << 32) + fd.nFileSizeLow ;
		}
	}while( FindNextFile( hFileFind, &fd ) );
	FindClose( hFileFind );
	return dwSize;
}

//非递归方式
int  EnumDirFile(LPCTSTR strDir, vector<FILEINFO>& vec)
{
	TCHAR oriFilePath[ MAX_PATH ] = { 0 };
	TCHAR szFilePath[ MAX_PATH ] = { 0 };
	wcsncpy( oriFilePath, strDir, MAX_PATH);
	wcsncpy( szFilePath, strDir, MAX_PATH);
	PathAppend( szFilePath, _T("\\*.*"));
	WIN32_FIND_DATA fd = { 0 };
	HANDLE hFileFind = FindFirstFile( szFilePath, &fd);
	if( INVALID_HANDLE_VALUE == hFileFind )
	{
		return 0;
	}
	do 
	{
		if( StrCmpI(fd.cFileName, _T(".")) && StrCmpI(fd.cFileName, _T("..")))		//过滤掉 ./.. 文件夹
		{
			fileInfo.nFileSizeHigh = fd.nFileSizeHigh;
			fileInfo.nFileSizeLow  = fd.nFileSizeLow;
			wcsncpy(fileInfo.cFilePath, oriFilePath, MAX_PATH);

			PathAppend(fileInfo.cFilePath, fd.cFileName);   //完整路径
			fileInfo.dwFileAttributes = fd.dwFileAttributes;
			vec.push_back(fileInfo);
		}

	} while ( FindNextFile(hFileFind, &fd));
	FindClose( hFileFind );
	return 0;
}

int GetDirFile( LPCTSTR strDir)
{
	vector<FILEINFO> vec;
	EnumDirFile(strDir, vec);		//枚举当前文件夹下所有文件
	ULONGLONG dwSize = 0;
	//遍历所有文件,计算整体文件的大小
	for(int index = 0; vec.size() > index; ++index)
	{
		if( vec[index].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)			//判断该文件是一个文件夹
		{
			EnumDirFile( vec[index].cFilePath, vec);
		}
		else			//如果不是文件夹,直接把文件大小加上
			dwSize += ( (ULONGLONG)(vec[index].nFileSizeHigh) << 32) + vec[index].nFileSizeLow;
	}
	return dwSize;
}


<think>我们被要求回答如何在Windows系统中查询磁盘上各个文件夹大小。根据提供的引用,我们可以总结出几种方法: 1. 使用Windows资源管理器(内置工具)查看单个文件夹大小(引用[1]和引用[2]) 2. 使用PowerShell脚本(引用[3]) 3. 使用第三方工具TreeSize Free(引用[4]) 因此,我们可以按照这三种方法进行回答,并确保回答结构清晰。 注意:引用[3]提供的PowerShell脚本是针对C:\Users目录的,我们可以稍作修改以适用于任意目录。 步骤: 1. 介绍使用资源管理器查看单个文件夹大小的方法。 2. 介绍使用PowerShell脚本查看多个文件夹大小的方法(并给出修改后的脚本)。 3. 介绍使用TreeSize Free工具的方法。 最后,按照要求生成相关问题。 由于引用中已经提供了具体步骤,我们将整合这些信息。</think>### Windows 查看磁盘各文件夹大小方法 #### 方法一:使用资源管理器(内置工具) 1. **打开资源管理器** 按 `Win+E` 快捷键或点击任务栏文件夹图标。 2. **定位目标磁盘** 在左侧导航栏选择磁盘(如 `C:`)。 3. **查看文件夹大小** - 右键点击目标文件夹 → 选择 **"属性"** - 在属性窗口查看 **"大小"** 和 **"包含的文件数"** *示例:查看 `C:\Users` 文件夹大小[^1][^2]* > ✅ 优点:无需安装软件,适合快速查看单个文件夹 > ❌ 限制:无法批量查看所有子文件夹大小 #### 方法二:使用PowerShell脚本(批量查看) 1. 按 `Win+X` → 选择 **"终端(管理员)"** 2. 复制执行以下脚本(修改 `$startFolder` 路径为目标磁盘): ```powershell $startFolder = 'C:\' # 修改为目标磁盘 $colItems = (Get-ChildItem -Force $startFolder | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object) $list = @() foreach ($i in $colItems) { $subFolderItems = (Get-ChildItem $i.FullName -recurse -ErrorAction SilentlyContinue | Measure-Object -property length -sum) $file = [PSCustomObject]@{ name = $i.name size = $subFolderItems.sum } $list += $file } $list | Sort-Object -Descending -Property size | Format-Table name,@{n='Size(GB)';e={"{0:N2}" -f ($_.size/1GB)}} ``` 3. 脚本将按文件夹大小降序输出表格[^3] > 💡 输出示例: > | name | Size(GB) | > |------------|----------| > | Program Files | 15.32 | > | Users | 10.17 | > | Windows | 8.63 | #### 方法三:第三方工具 TreeSize Free(推荐) 1. **下载安装** 访问[官网](https://www.jam-software.de/treesize_free) → 选择 **Portable Version**(免安装版) 2. **使用步骤**: - 打开软件 → 点击 **"Select Directory"** - 选择目标磁盘(如 `C:`) - 自动扫描并显示 **树状大小分布图** - 支持按大小/文件数/修改时间排序[^4] > 🌟 优势: > - 直观的颜色标记大文件夹 > - 可导出CSV报告 > - 右键直接清理文件 --- ### 存储优化建议 - 定期检查 `C:\Users\<用户名>\AppData\Local\Temp` 临时文件夹 - 使用 **"磁盘清理"** 工具(搜索 `cleanmgr`) - 大文件迁移:将视频/图片库转移到非系统盘
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值