C#树图显示目录下所有文件以及文件大小

news2025/1/22 5:58:10

C#树图显示目录下所有文件以及文件大小

我们在打开某个目录属性时,可以查看到有大小信息.如下图

而一个目录(文件夹)System.IO.Directory是没有FileSize或者Length属性的.

目录(文件夹)的大小是指该目录下所有子目录和所有文件大小的累加,按字节为单位.

新建窗体应用程序GetFolderFileSizeDemo,将默认的Form1重命名为FormFolderFileSize,

窗体FormFolderFileSize设计器代码如下

文件FormFolderFileSize.Designer.cs


namespace GetFolderFileSizeDemo
{
    partial class FormFolderFileSize
    {
        /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows 窗体设计器生成的代码

        /// <summary>
        /// 设计器支持所需的方法 - 不要修改
        /// 使用代码编辑器修改此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.btnSelect = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.txtFolderPath = new System.Windows.Forms.TextBox();
            this.tvFile = new System.Windows.Forms.TreeView();
            this.imageList1 = new System.Windows.Forms.ImageList(this.components);
            this.rtxtMessage = new System.Windows.Forms.RichTextBox();
            this.SuspendLayout();
            // 
            // btnSelect
            // 
            this.btnSelect.Location = new System.Drawing.Point(659, 12);
            this.btnSelect.Name = "btnSelect";
            this.btnSelect.Size = new System.Drawing.Size(75, 23);
            this.btnSelect.TabIndex = 0;
            this.btnSelect.Text = "选择目录";
            this.btnSelect.UseVisualStyleBackColor = true;
            this.btnSelect.Click += new System.EventHandler(this.btnSelect_Click);
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(12, 14);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(65, 12);
            this.label1.TabIndex = 1;
            this.label1.Text = "请选择目录";
            // 
            // txtFolderPath
            // 
            this.txtFolderPath.Location = new System.Drawing.Point(102, 11);
            this.txtFolderPath.Name = "txtFolderPath";
            this.txtFolderPath.ReadOnly = true;
            this.txtFolderPath.Size = new System.Drawing.Size(551, 21);
            this.txtFolderPath.TabIndex = 2;
            // 
            // tvFile
            // 
            this.tvFile.ImageIndex = 0;
            this.tvFile.ImageList = this.imageList1;
            this.tvFile.Location = new System.Drawing.Point(14, 38);
            this.tvFile.Name = "tvFile";
            this.tvFile.SelectedImageIndex = 0;
            this.tvFile.Size = new System.Drawing.Size(573, 480);
            this.tvFile.TabIndex = 3;
            this.tvFile.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.tvFile_AfterSelect);
            // 
            // imageList1
            // 
            this.imageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit;
            this.imageList1.ImageSize = new System.Drawing.Size(16, 16);
            this.imageList1.TransparentColor = System.Drawing.Color.Transparent;
            // 
            // rtxtMessage
            // 
            this.rtxtMessage.Location = new System.Drawing.Point(593, 38);
            this.rtxtMessage.Name = "rtxtMessage";
            this.rtxtMessage.ReadOnly = true;
            this.rtxtMessage.Size = new System.Drawing.Size(377, 480);
            this.rtxtMessage.TabIndex = 4;
            this.rtxtMessage.Text = "";
            // 
            // FormFolderFileSize
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(982, 548);
            this.Controls.Add(this.rtxtMessage);
            this.Controls.Add(this.tvFile);
            this.Controls.Add(this.txtFolderPath);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.btnSelect);
            this.Name = "FormFolderFileSize";
            this.Text = "获取指定目录下的累计文件大小,并按树图显示";
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        #endregion

        private System.Windows.Forms.Button btnSelect;
        private System.Windows.Forms.Label label1;
        private System.Windows.Forms.TextBox txtFolderPath;
        private System.Windows.Forms.TreeView tvFile;
        private System.Windows.Forms.RichTextBox rtxtMessage;
        private System.Windows.Forms.ImageList imageList1;
    }
}

窗体FormFolderFileSize相关代码如下:

文件FormFolderFileSize.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GetFolderFileSizeDemo
{
    public partial class FormFolderFileSize : Form
    {
        public FormFolderFileSize()
        {
            InitializeComponent();
            imageList1.Images.Add(Properties.Resources.file);//文件图标
            imageList1.Images.Add(Properties.Resources.folder);//目录(文件夹)图标
        }

        private void btnSelect_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog folderBrowser = new FolderBrowserDialog();
            folderBrowser.SelectedPath = "D:\\";
            DialogResult dialog = folderBrowser.ShowDialog();
            if (dialog != DialogResult.OK) 
            {
                return;
            }
            string selectedFolder = folderBrowser.SelectedPath;
            txtFolderPath.Text = selectedFolder;
            rtxtMessage.Clear();
            tvFile.Nodes.Clear();
            TreeNodeCollection nodes = tvFile.Nodes;
            TreeNode rootNode = new TreeNode(Path.GetFileName(selectedFolder))
            {
                ImageIndex = 1,
                SelectedImageIndex = 1,
                Tag = selectedFolder //记录文件或者文件夹的路径
            };
            nodes.Add(rootNode);
            BindTreeView(rootNode.Nodes, selectedFolder);
            rootNode.Expand();
            tvFile.SelectedNode = rootNode;
        }

        private void BindTreeView(TreeNodeCollection nodes, string directoryPath) 
        {
            //读取当前目录下的下一级目录,将其添加到队列中
            string[] directories = Directory.GetDirectories(directoryPath);
            for (int i = 0; i < directories.Length; i++)
            {
                TreeNode treeNode = new TreeNode(Path.GetFileName(directories[i]))
                {
                    ImageIndex = 1,
                    SelectedImageIndex = 1,
                    Tag = directories[i] //记录文件或者文件夹的路径
                };
                nodes.Add(treeNode);
                BindTreeView(treeNode.Nodes, directories[i]);
            }
            //读取当前目录下的所有文件,直接显示到树图中
            string[] files = Directory.GetFiles(directoryPath);
            for (int i = 0; i < files.Length; i++)
            {
                nodes.Add(new TreeNode(Path.GetFileName(files[i]))
                {
                    ImageIndex = 0,
                    SelectedImageIndex = 0,
                    Tag = files[i] //记录文件或者文件夹的路径
                });
            }
        }

        private void tvFile_AfterSelect(object sender, TreeViewEventArgs e)
        {
            rtxtMessage.Clear();
            TreeNode treeNode = e.Node;
            if (treeNode == null) 
            {
                return;
            }
            string path = Convert.ToString(treeNode.Tag);
            long totalSize = 0L;
            if (treeNode.ImageIndex == 0)
            {
                //如果是文件,就直接读取大小
                totalSize = GetFileSize(path);
                rtxtMessage.AppendText($"【文件】\n路径:【{path}】\n文件大小:【{GetFileSizeDescription(totalSize)}】");
            }
            else 
            {
                //如果是目录(文件夹),就递归读取所有文件
                totalSize = GetFolderSize(path);
                rtxtMessage.AppendText($"【目录】\n路径:【{path}】\n文件大小:【{GetFileSizeDescription(totalSize)}】");
            }
        }

        /// <summary>
        /// 获取指定文件的大小,按字节为单位
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        private long GetFileSize(string fileName) 
        {
            if (!File.Exists(fileName)) 
            {
                return 0;
            }
            return new FileInfo(fileName).Length;
        }

        /// <summary>
        /// 递归遍历所有文件,获取目录(文件夹)累计占用的文件大小,按字节为单位
        /// </summary>
        /// <param name="folderPath"></param>
        /// <returns></returns>
        private long GetFolderSize(string folderPath)
        {
            if (!Directory.Exists(folderPath))
            {
                return 0; 
            }
            long totalSize = 0L;
            Queue<string> directoryCollection = new Queue<string>();
            directoryCollection.Enqueue(folderPath);
            while (directoryCollection.Count > 0)
            {
                string directoryPath = directoryCollection.Dequeue();
                //读取当前目录下的下一级目录,将其添加到队列中
                string[] directories = Directory.GetDirectories(directoryPath);
                for (int i = 0; i < directories.Length; i++)
                {
                    directoryCollection.Enqueue(directories[i]);
                }
                //读取当前目录下的所有文件,计算字节树
                string[] files = Directory.GetFiles(directoryPath);
                for (int i = 0; i < files.Length; i++)
                {
                    totalSize += GetFileSize(files[i]);
                }
            }
            return totalSize;
        }

        /// <summary>
        /// 获取文件大小描述
        /// </summary>
        /// <param name="fileSize"></param>
        /// <returns></returns>
        private string GetFileSizeDescription(long fileSize) 
        {
            const long KByte = 1024L;
            const long MByte = 1024L * KByte;
            const long GByte = 1024L * MByte;
            if (fileSize >= GByte)
            {
                return ((double)fileSize / GByte).ToString("N2") + "\x20GB";
            }
            else if (fileSize >= MByte) 
            {
                return ((double)fileSize / MByte).ToString("N2") + "\x20MB";
            }
            else if (fileSize >= KByte)
            {
                return (fileSize / KByte).ToString() + "\x20KB";//KB用整数表示
            }
            return fileSize + "\x20字节";
        }
    }
}

显示如图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2280196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣707题——设计链表

#题目 从零开始设计链表&#xff0c;我们拆分成两次任务&#xff0c;今天先看1 ,2 ,4 #代码

机器学习09-Pytorch功能拆解

机器学习09-Pytorch功能拆解 我个人是Java程序员&#xff0c;关于Python代码的使用过程中的相关代码事项&#xff0c;在此进行记录 文章目录 机器学习09-Pytorch功能拆解1-核心逻辑脉络2-个人备注3-Pytorch软件包拆解1-Python有参和无参构造构造方法的基本语法示例解释注意事项…

天津市开通首个万兆宽带:1秒钟下载1GB文件

快科技1月21日消息&#xff0c;华为光网宣布&#xff0c;天津联通携手华为&#xff0c;日前成功为天津市北辰区柴楼金园小区部署了天津市首个万兆宽带网络。 在现场测速环节中&#xff0c;该万兆宽带网络展现出了惊人的速度——高达9429Mbps的下载速率&#xff0c;几乎跑满带宽…

html全局遮罩,通过websocket来实现实时发布公告

1.index.html代码示例 <div id"websocket" style"display:none;position: absolute;color:red;background-color: black;width: 100%;height: 100%;z-index: 100; opacity: 0.9; padding-top: 30%;padding-left: 30%; padding-border:1px; "onclick&q…

数据结构(四) B树/跳表

目录 1. LRU 2. B树 3. 跳表 1. LRU: 1.1 概念: 最近最少使用算法, 就是cache缓存的算法. 因为cache(位于内存和cpu之间的存储设备)是一种容量有限的缓存, 有新的数据进入就需要将原本的数据进行排出. 1.2 LRU cache实现: #include <iostream> #include <list>…

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

CSDN年度回顾:技术征途上的坚实步伐

嘿&#xff0c;时光过得可真快呀&#xff0c;就像那匹跑得飞快的白马&#xff0c;嗖的一下&#xff0c;2024 年的日历就这么悄无声息地翻到了最后一页。这会儿我回头看看在 CSDN 上度过的这一年&#xff0c;心里那叫一个感慨万千&#xff0c;满满的都是喜悦&#xff0c;就像心里…

解决 PostgreSQL 中创建 TimescaleDB 扩展的字符串错误

解决 PostgreSQL 中创建 TimescaleDB 扩展的字符串错误 在使用 PostgreSQL 数据库并尝试创建 TimescaleDB 扩展时&#xff0c;你可能会遇到一些棘手的错误。今天&#xff0c;我们就来探讨一个常见的错误信息及相应的解决方法&#xff1a; CREATE EXTENSION IF NOT EXISTS tim…

【语言处理和机器学习】概述篇(基础小白入门篇)

前言 自学笔记&#xff0c;分享给语言学/语言教育学方向的&#xff0c;但对语言数据处理感兴趣但是尚未入门&#xff0c;却需要在论文中用到的小伙伴&#xff0c;欢迎大佬们补充或绕道。ps&#xff1a;本文不涉及公式讲解&#xff08;文科生小白友好体质&#xff09;&#xff…

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

前言 手头上有个ESP32&#xff0c;发现有wifi功能&#xff0c;希望连接JY61P并通过WIFI把姿态数据发送给电脑 1.采用Arduino IDE编译器&#xff1b;需要安装ESP32的开发板管理器&#xff1b; 2.电脑接受数据是基于python的&#xff1b; 1. ESP32 连接手机WIFI #include <…

将 Docker 安装到 Windows 的 D 盘的方法

1.官网下载Docker Desktop Installer.exe&#xff0c;官网网址&#xff1a;Get Started | Docker 2.以管理员身份打开 Windows 终端 3.切换到 你Docker Desktop Installer.exe下载到的地址 4.在运行代码前&#xff0c;需要提前手动创建好D:\Program Files\Docker和D:\Program F…

DeepSeek-R1-GRPO理解

一、GRPO GRPO&#xff08;Group Relative Policy Optimization&#xff09;是一种强化学习&#xff08;Reinforcement Learning, RL&#xff09;算法&#xff0c;专门用于训练大型语言模型&#xff08;LLMs&#xff09;在复杂任务&#xff08;如数学推理、代码生成等&#xf…

Unreal Engine 5 C++ Advanced Action RPG 十章笔记

第十章 Survival Game Mode 2-Game Mode Test Map 设置游戏规则进行游戏玩法 生成敌人玩家是否死亡敌人死亡是否需要刷出更多 肯定:难度增加否定:玩家胜利 流程 新的游戏模式类游戏状态新的数据表来指定总共有多少波敌人生成逻辑UI告诉当前玩家的敌人波数 3-Survival Game M…

接口(1)

大家好&#xff0c;今天我们来看看接口的概念&#xff0c;接口跟类的使用是有一些区别的&#xff0c;接口中都是抽象方法&#xff0c;简单介绍一下后&#xff0c;我们正式来学习。 2、接口 接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用. 在java中,…

docker离线安装及部署各类中间件(x86系统架构)

前言&#xff1a;此文主要针对需要在x86内网服务器搭建系统的情况 一、docker离线安装 1、下载docker镜像 https://download.docker.com/linux/static/stable/x86_64/ 版本&#xff1a;docker-23.0.6.tgz 2、将docker-23.0.6.tgz 文件上传到服务器上面&#xff0c;这里放在…

debian中apt的配置与解析

引言 在系统使用过程中&#xff0c;我们可能会遭遇 apt update 操作出现问题&#xff0c;或者 apt upgrade 速度迟缓的情况。这往往是由于所使用软件源本身存在诸如服务器性能不佳、维护不及时等质量问题&#xff0c;同时&#xff0c;软件源服务器与我们所处地理位置的距离较远…

python创建一个httpServer网页上传文件到httpServer

一、代码 1.server.py import os from http.server import SimpleHTTPRequestHandler, HTTPServer import cgi # 自定义请求处理类 class MyRequestHandler(SimpleHTTPRequestHandler):# 处理GET请求def do_GET(self):if self.path /:# 响应200状态码self.send_response(2…

Git处理冲突详解

文章目录 Git处理冲突详解一、引言二、冲突产生的原因三、解决冲突的步骤1. 手动解决冲突1.1 查看冲突文件1.2 编辑冲突文件1.3 提交解决冲突 2. 使用合并工具解决冲突 四、使用示例五、总结 Git处理冲突详解 一、引言 在团队协作开发中&#xff0c;Git冲突是不可避免的。当多…

如何降低振荡器的相位噪音

相位噪音&#xff08;Phase Noise&#xff09;是振荡器设计中一个重要的性能指标&#xff0c;尤其在高精度和高频应用中。相位噪音不仅影响信号的质量&#xff0c;还可能对后续系统的性能造成显著影响。因此&#xff0c;如何有效降低振荡器的相位噪音成为了科研与工业界关注的热…

一文读懂 RocketMQ:从概念到架构与应用原理概述

文章目录 概述架构说明核心组件核心概念 namesvrproducer默认实现producer启动消息发送 broker-mq核心基本模型集群模型内部模型存储机制高可用 consumerpush类型push流程pull类型 概述 随着分布式技术在业内的快速应用&#xff0c;mq&#xff08;消息队列&#xff09;做为不可…