C# 获取windows的上传下载速度

直接利用CZGL.SystemInfo代码
UnitType.cs


/// <summary>
/// 单位
/// </summary>
public enum UnitType : int
{
    /// <summary>
    /// Byte
    /// </summary>
    /// 
    B = 0,
    /// <summary>
    /// KB
    /// </summary>
    KB,

    /// <summary>
    /// MB
    /// </summary>
    MB,

    /// <summary>
    /// GB
    /// </summary>
    GB,

    /// <summary>
    /// TB
    /// </summary>
    TB,

    /// <summary>
    /// PB
    /// </summary>
    PB
}

SizeInfo.cs


/// <summary>
/// 大小信息
/// </summary>
public struct SizeInfo
{
    /// <summary>
    /// Byte 长度
    /// </summary>
    public long ByteLength { get; private set; }

    /// <summary>
    /// 大小
    /// </summary>
    public decimal Size { get; set; }

    /// <summary>
    /// 单位
    /// </summary>
    public UnitType SizeType { get; set; }


    /// <summary>
    /// 将字节单位转换为合适的单位
    /// </summary>
    /// <param name="byteLength">字节长度</param>
    /// <returns></returns>
    public static SizeInfo Get(long byteLength)
    {
        UnitType unit = 0;
        decimal number = byteLength;
        if (byteLength < 1000)
        {
            return new SizeInfo()
            {
                ByteLength = byteLength,
                Size = byteLength,
                SizeType = UnitType.B
            };
        }
        // 避免出现 1023B 这种情况;这样 1023B 会显示 0.99KB
        while (Math.Round(number / 1000) >= 1)
        {
            number = number / 1024;
            unit++;
        }

        return new SizeInfo
        {
            Size = Math.Round(number, 2),
            SizeType = unit,
            ByteLength = byteLength
        };

        throw new Exception();
    }
}

Rate.cs

/// <summary>
/// 网速
/// </summary>
public struct Rate
{
    public Rate(DateTime startTime, long receivedLength, long sendLength)
    {
        StartTime = startTime;
        ReceivedLength = receivedLength;
        SendLength = sendLength;
    }

    /// <summary>
    /// 记录时间
    /// </summary>
    public DateTime StartTime { get; private set; }

    /// <summary>
    /// 此网卡总接收网络流量字节数
    /// </summary>
    public long ReceivedLength { get; private set; }

    /// <summary>
    /// 此网卡总发送网络流量字节数
    /// </summary>
    public long SendLength { get; private set; }
}

NetworkInfo.cs

using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Runtime.InteropServices;


/// <summary>
    /// 网络接口信息
    /// </summary>
    public class NetworkInfo
    {
        private NetworkInterface _instance;

        private NetworkInfo(NetworkInterface network)
        {
            _instance = network;
        }

        /// <summary>
        /// 当前实例使用的网络接口
        /// </summary>
        public NetworkInterface NetworkInterface => _instance;


        #region 基础信息

        /// <summary>
        /// 获取网络适配器的标识符
        /// </summary>
        /// <remarks>ex:{92D3E528-5363-43C7-82E8-D143DC6617ED}</remarks>
        public string Id => _instance.Id;

        /// <summary>
        /// 网络的 Mac 地址
        /// </summary>
        /// <remarks>ex: 1C997AF108E3</remarks>
        public string Mac => _instance.GetPhysicalAddress().ToString();

        /// <summary>
        /// 网卡名称
        /// </summary>
        /// <remarks>ex:以太网,WLAN</remarks>
        public string Name => _instance.Name;


        /// <summary>
        /// 描述网络接口的用户可读文本,
        /// 在 Windows 上,它通常描述接口供应商、类型 (例如,以太网) 、品牌和型号;
        /// </summary>
        /// <remarks>ex:Realtek PCIe GbE Family Controller、  Realtek 8822CE Wireless LAN 802.11ac PCI-E NIC</remarks>
        public string Trademark => _instance.Description;

        /// <summary>
        /// 获取网络连接的当前操作状态<br />
        /// </summary>
        public OperationalStatus Status => _instance.OperationalStatus;

        /// <summary>
        /// 获取网卡接口类型<br />
        /// </summary>
        public NetworkInterfaceType NetworkType => _instance.NetworkInterfaceType;

        /// <summary>
        /// 网卡链接速度,每字节/秒为单位
        /// </summary>
        /// <remarks>如果是-1,则说明无法获取此网卡的链接速度;例如 270_000_000 表示是 270MB 的链接速度</remarks>
        public long Speed => _instance.Speed;

        /// <summary>
        /// 是否支持 Ipv4
        /// </summary>
        public bool IsSupportIpv4 => _instance.Supports(NetworkInterfaceComponent.IPv4);

        /// <summary>
        /// 获取分配给此接口的任意广播 IP 地址。只支持 Windows
        /// </summary>
        /// <remarks>一般情况下为空数组</remarks>
        public IPAddress[] AnycastAddresses
        {
            get
            {
                if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
                {
                    return _instance.GetIPProperties().AnycastAddresses.Select(x => x.Address).ToArray();
                }
                else
                {
                    return Array.Empty<IPAddress>();
                }
            }
        }

        /// <summary>
        /// 获取分配给此接口的多播地址,ipv4、ipv6
        /// </summary>
        /// <remarks>ex:ff01::1%9 ff02::1%9<br />
        /// ff02::fb%9<br />
        /// ff02::1:3%9<br />
        /// ff02::1:ff61:9ae7%9<br />
        /// 224.0.0.1</remarks>
        public IPAddress[] MulticastAddresses => _instance.GetIPProperties().MulticastAddresses.Select(x => x.Address).ToArray();

        /// <summary>
        /// 获取分配给此接口的单播地址,ipv4、ipv6
        /// </summary>
        /// <remarks>ex:192.168.3.38</remarks>
        public IPAddress[] UnicastAddresses => _instance.GetIPProperties().UnicastAddresses.Select(x => x.Address).ToArray();

        /// <summary>
        /// 获取此接口的 IPv4 网关地址,ipv4、ipv6
        /// </summary>
        /// <remarks>ex:fe80::1677:40ff:fef9:bf95%5、192.168.3.1</remarks>
        public IPAddress[] GatewayAddresses => _instance.GetIPProperties().GatewayAddresses.Select(x => x.Address).ToArray();

        /// <summary>
        /// 获取此接口的域名系统 (DNS) 服务器的地址,ipv4、ipv6
        /// </summary>
        /// <remarks>ex:fe80::1677:40ff:fef9:bf95%5、192.168.3.1</remarks>
        public IPAddress[] DnsAddresses => _instance.GetIPProperties().DnsAddresses.ToArray();

        /// <summary>
        /// 是否支持 Ipv6
        /// </summary>
        public bool IsSupportIpv6 => _instance.Supports(NetworkInterfaceComponent.IPv6);

        #endregion



        /// <summary>
        /// 当前主机是否能够与其他计算机通讯(公网或内网),如果任何网络接口标记为 "up" 且不是环回或隧道接口,则认为网络连接可用。
        /// </summary>
        public static bool GetIsNetworkAvailable => NetworkInterface.GetIsNetworkAvailable();

        /// <summary>
        /// 计算 IPV4 的网络流量
        /// </summary>
        /// <returns></returns>
        /// <exception cref="NotSupportedException">当前网卡不支持 IPV4</exception>
        public Rate GetIpv4Speed()
        {
            // 当前网卡不支持 IPV4
            if (!IsSupportIpv4) return default;
            var ipv4Statistics = _instance.GetIPv4Statistics();
            var speed = new Rate(DateTime.Now, ipv4Statistics.BytesReceived, ipv4Statistics.BytesSent);
            return speed;
        }

        /// <summary>
        /// 计算 IPV4 、IPV6 的网络流量
        /// </summary>
        /// <returns></returns>
        public Rate IpvSpeed()
        {
            var ipvStatistics = _instance.GetIPStatistics();
            var speed = new Rate(DateTime.Now, ipvStatistics.BytesReceived, ipvStatistics.BytesSent);
            return speed;
        }

        /// <summary>
        /// 获取所有 IP 地址
        /// </summary>
        /// <returns></returns>
        public static IPAddress[] GetIPAddresses()
        {
            var hostName = Dns.GetHostName();
            return Dns.GetHostAddresses(hostName);
        }

        /// <summary>
        /// 获取当前真实 IP
        /// </summary>
        /// <returns></returns>
        public static IPAddress? TryGetRealIpv4()
        {
            var addrs = GetIPAddresses();
            var ipv4 = addrs.FirstOrDefault(x => x.AddressFamily == AddressFamily.InterNetwork);
            return ipv4;
        }

        /// <summary>
        /// 获取真实网卡
        /// </summary>
        /// <returns></returns>
        public static NetworkInfo? TryGetRealNetworkInfo()
        {
            var realIp = TryGetRealIpv4();
            if (realIp == null)
            {
                return default;
            }
            var infos = NetworkInfo.GetNetworkInfos().ToArray();
            var info = infos.FirstOrDefault(x => x.UnicastAddresses.Any(x => x.MapToIPv4().ToString() == realIp.MapToIPv4().ToString()));
            if (info == null)
            {
                return default;
            }
            return info;
        }

        /// <summary>
        /// 获取此主机中所有网卡接口
        /// </summary>
        /// <returns></returns>
        public static NetworkInfo[] GetNetworkInfos()
        {
            return NetworkInterface.GetAllNetworkInterfaces().Select(x => new NetworkInfo(x)).ToArray();
        }

        /// <summary>
        /// 计算网络流量速率
        /// </summary>
        /// <param name="oldRate"></param>
        /// <param name="newRate"></param>
        /// <returns></returns>
        public static (SizeInfo Received, SizeInfo Sent) GetSpeed(Rate oldRate, Rate newRate)
        {
            var receive = newRate.ReceivedLength - oldRate.ReceivedLength;
            var send = newRate.SendLength - oldRate.SendLength;
            var interval = Math.Round((newRate.StartTime - oldRate.StartTime).TotalSeconds, 2);

            long rSpeed = (long)(receive / interval);
            long sSpeed = (long)(send / interval);

            return (SizeInfo.Get(rSpeed), SizeInfo.Get(sSpeed));
        }
    }

使用

var network = NetworkInfo.TryGetRealNetworkInfo();
var oldRate = network.GetIpv4Speed();
while (true)
{
    Thread.Sleep(1000);
    var newRate = network.GetIpv4Speed();
    var speed = NetworkInfo.GetSpeed(oldRate, newRate);
    oldRate = newRate;
    Console.Clear();
    Console.WriteLine($"上传:{speed.Sent.Size} {speed.Sent.SizeType}/S    下载:{speed.Received.Size} {speed.Received.SizeType}/S");
}

参考

https://www.jb51.net/article/190663.htm
https://blog.csdn.net/chscomfaner/article/details/82784999
https://github.com/ewwink/NetworkSpeed
https://learn.microsoft.com/zh-cn/dotnet/api/system.net.networkinformation.networkinterfacetype?view=netcore-3.1
https://github.com/whuanle/CZGL.SystemInfo

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你可以使用 C# 中的 OpenFileDialog 控件来实现批量上传多个文件,这需要你在客户端手动选择多个文件进行上传。 以下是一个简单的示例代码: ``` using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Windows.Forms; namespace FileUploader { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void btnUpload_Click(object sender, EventArgs e) { // 创建 OpenFileDialog 对象 OpenFileDialog openFileDialog = new OpenFileDialog(); // 设置文件选择框的属性 openFileDialog.Multiselect = true; openFileDialog.Filter = "All files (*.*)|*.*"; // 显示文件选择框 DialogResult result = openFileDialog.ShowDialog(); // 如果用户选择了文件,则上传文件 if (result == DialogResult.OK) { // 获取用户选择的文件列表 List<string> fileNames = openFileDialog.FileNames.ToList(); // 遍历文件列表,上传每个文件 foreach (string fileName in fileNames) { // 上传文件 UploadFile(fileName); } } } private void UploadFile(string fileName) { // TODO: 在这里编写上传文件的代码 // 示例代码:将文件名输出到控制台 Console.WriteLine(fileName); } } } ``` 在上面的示例代码中,当用户点击 "上传" 按钮时,会显示一个文件选择框,允许用户选择多个文件进行上传。选择完成后,程序将获取用户选择的文件列表,并遍历列表,对每个文件调用 UploadFile 方法进行上传。在 UploadFile 方法中,你可以编写自己的上传代码。这里的示例代码只是将文件名输出到控制台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

假装我不帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值