C# 8.0 文件长度 Bytes 字节转 KB 等单位字符串
时间:2022-07-22
本文章向大家介绍C# 8.0 文件长度 Bytes 字节转 KB 等单位字符串,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文将使用 C# 8.0 写一个相对比较省内存和性能不差的将文件长度从 Bytes 转换为单位使用 KB 或 MB 或 GB 等单位的字符串的方法
代码可以复制在你的实际软件中使用
static class FileSizeFormatter
{
public static string FormatSize(long bytes, string formatString = "{0:0.00}")
{
int counter = 0;
double number = bytes;
// 最大单位就是 PB 了,而 PB 是第 5 级,从 0 开始数
// "Bytes", "KB", "MB", "GB", "TB", "PB"
const int maxCount = 5;
while (Math.Round(number / 1024) >= 1)
{
number = number / 1024;
counter++;
if (counter >= maxCount)
{
break;
}
}
var suffix = counter switch
{
0 => "B",
1 => "KB",
2 => "MB",
3 => "GB",
4 => "TB",
5 => "PB",
// 通过 maxCount 限制了最大的值就是 5 了
_ => throw new ArgumentException("骚年,你是不是忘了更新 maxCount 等级了")
};
return $"{string.Format(formatString, number)}{suffix}";
}
}
上面代码使用的 switch 根据 counter 返回对应的单位,对比使用数组的优势在于不需要创建数组对象,能省一点内存。同时进行的计算也比较少,相对性能也不差
上面代码的 ArgumentException 在没有更改代码逻辑是不会进入的,因为通过 maxCount 限制了单位最大就是 PB 了
试试以下测试代码
for (int i = 0; i < 10; i++)
{
Debug.WriteLine(FileSizeFormatter.FormatSize((long)Math.Pow(10, i)));
}
可以看到控制台的输出如下
1.00B
10.00Bytes
100.00Bytes
0.98KB
9.77KB
97.66KB
0.95MB
9.54MB
95.37MB
0.93GB
其他小伙伴的实现如下
c# 字节单位转换_weixin_34405925的博客-CSDN博客_c# 单位转换
C#实现获取文件大小进行单位转换与文件大小比较_xiaochenXIHUA的博客-CSDN博客_c# 文件大小单位
也有更快计算当前的数值对应的单位的等级的方法,就是通过 Math.Log 的方法,我没有测试性能对比,但是看起来相差很小,因为循环也就是最多 5 次
var mag = (int)Math.Max(0, Math.Log(value, 1024));
var adjustedSize = Math.Round(value / Math.Pow(1024, mag), decimalPlaces);
当然,也有更快的方法,就是通过判断大小
private string GetFileSize(double byteCount)
{
string size = "0 B";
if (byteCount >= 1073741824.0)
size = string.Format("{0:##.##}", byteCount / 1073741824.0) + " GB";
else if (byteCount >= 1048576.0)
size = string.Format("{0:##.##}", byteCount / 1048576.0) + " MB";
else if (byteCount >= 1024.0)
size = string.Format("{0:##.##}", byteCount / 1024.0) + " KB";
else if (byteCount > 0 && byteCount < 1024.0)
size = byteCount.ToString() + " B";
return size;
}
只是判断大小的代码没有用到 C# 8.0 因此依然推荐小伙伴使用本文开始的代码
本文会经常更新,请阅读原文: https://blog.lindexi.com/post/C-8.0-%E6%96%87%E4%BB%B6%E9%95%BF%E5%BA%A6-Bytes-%E5%AD%97%E8%8A%82%E8%BD%AC-KB-%E7%AD%89%E5%8D%95%E4%BD%8D%E5%AD%97%E7%AC%A6%E4%B8%B2.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
- DBA和开发同事的一些代沟(五) (r7笔记第92天)
- 55. 上传文件(Web版) | 厚土Go学习笔记
- ASM无法启动的问题分析(一)(r7笔记第87天)
- 54. 心跳的实现 | 厚土Go学习笔记
- 53. Socket服务三次握手的示例 | 厚土Go学习笔记
- 使用Beego+Swagger构建更好的API服务
- ASM无法启动的问题分析(二)(r7笔记第88天)
- 43. 等价二叉树 | 厚土Go学习笔记
- 51. Socket服务端和客户端使用TCP协议通讯 | 厚土Go学习笔记
- 50. RESTful API的简单实现 | 厚土Go学习笔记
- go实现西瓜视频花椒直播等平台智能答题
- 主备切换的准备工作(二) (r7笔记第85天)
- 49. 访问PostgreSQL数据库增删改查 | 厚土Go学习笔记
- Golang中Interface类型详解
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 实例详解Android Webview拦截ajax请求
- Android给布局、控件加阴影效果的示例代码
- XListView实现下拉刷新和上拉加载原理解析
- Android实现QQ侧滑(删除、置顶等)功能
- Android通过XListView实现上拉加载下拉刷新功能
- Android自定义View实现圆形切图效果
- Android仿iOS侧滑退出当前界面功能
- android仿支付宝密码输入框效果
- TextInputLayout输入框控件的悬浮标签
- android使用SwipeRefreshLayout实现ListView下拉刷新上拉加载
- Android自定义ScrollView使用自定义监听
- Android开发实现拨打电话与发送信息的方法分析
- Android 3.0引入的异步加载机制Loader
- 自定义注解1-实现spel表达式
- 自定义注解2-动态修改注解的属性值