Delphi函数像Windows一样显示字节数

2023-11-25

这是一个简单的问题(我认为)。

是否有一个系统内置函数,或者某人创建的可以从 Delphi 调用的函数,它将显示多个字节(例如文件大小),就像 Windows 在文件属性框中显示的方式一样?

例如这是 Windows 属性框显示各种尺寸的方式:

539 bytes (539 bytes)
35.1 KB (35,974 bytes)
317 MB (332,531,365 bytes)
2.07 GB (2,224,617,077 bytes)

显示屏会智能地使用字节、KB、MB 或 GB,并且仅显示 KB、MB 和 GB 的 3 位有效数字。然后,在括号中显示确切的字节数,并用逗号分隔千位。这是一个非常漂亮的展示,经过深思熟虑。

有谁知道这样的功能吗?


编辑:我很惊讶没有这个功能。

感谢您提供有用的想法。我想出了这个,这似乎有效:

function BytesToDisplay(A:int64): string;
var
  A1, A2, A3: double;
begin
  A1 := A / 1024;
  A2 := A1 / 1024;
  A3 := A2 / 1024;
  if A1 < 1 then Result := floattostrf(A, ffNumber, 15, 0) + ' bytes'
  else if A1 < 10 then Result := floattostrf(A1, ffNumber, 15, 2) + ' KB'
  else if A1 < 100 then Result := floattostrf(A1, ffNumber, 15, 1) + ' KB'
  else if A2 < 1 then Result := floattostrf(A1, ffNumber, 15, 0) + ' KB'
  else if A2 < 10 then Result := floattostrf(A2, ffNumber, 15, 2) + ' MB'
  else if A2 < 100 then Result := floattostrf(A2, ffNumber, 15, 1) + ' MB'
  else if A3 < 1 then Result := floattostrf(A2, ffNumber, 15, 0) + ' MB'
  else if A3 < 10 then Result := floattostrf(A3, ffNumber, 15, 2) + ' GB'
  else if A3 < 100 then Result := floattostrf(A3, ffNumber, 15, 1) + ' GB'
  else Result := floattostrf(A3, ffNumber, 15, 0) + ' GB';
  Result := Result + ' (' + floattostrf(A, ffNumber, 15, 0) + ' bytes)';
end;

这可能已经足够好了,但是还有更好的吗?


看下面的函数,都在shlwapi library.

  • StrFormatByteSizeA(双字参数)
  • StrFormatByteSizeW(Int64参数)
  • StrFormatByteSize64(在 Unicode 模式下,这确实是StrFormatByteSizeW)
  • StrFormatByteSizeEx(Vista SP2;可以控制舍入)

其中任何一个都会为您提供所需显示格式的第一部分。检查文档或编写您自己的测试,以确认它们提供了您期望的关于 1 MB 是由 1000 还是 1024 KB 组成的转换。对于显示格式的第二部分,您可以从另一个 Stack Overflow 问题的答案开始:

  • 如何将 int 转换为货币?(他实际上是在问如何插入逗号,而不是专门问钱。)

但也许这个问题是错误的,因为那里有所有的建议,以及FloatToStrF,失败于上限Int64。您将丢失一些字节,但我认为这些字节非常重要,因为该显示格式中第二个值的目的是提供准确的数字。

完成所有部件后,将它们粘在一起。我正在使用一个假设IntToStrCommas函数在这里,如果你想将其实现为FloatToStrF, 前进。

function BytesToDisplay(const num: Int64): string;
var
  // If GB is the largest unit available, then 20 characters is
  // enough for "17,179,869,183.99 GB", which is MaxUInt64.
  buf: array[0..20] of Char;
begin
  if StrFormatByteSize64(num, buf, Length(buf)) = nil then
    raise EConvertError.CreateFmt('Error converting %d', [num]);
  Result := Format('%s (%s bytes)', [buf, IntToStrCommas(num)]);
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi函数像Windows一样显示字节数 的相关文章

  • 通过“修改日期”确定文件夹中的哪个文件是最新的?

    我需要扫描特定文件夹中的最新文件 基本上检查修改日期以查看哪个是最新的 但请记住这些文件具有随机名称 这是我到目前为止得到的 procedure TForm1 Button1Click Sender TObject begin ftp Ho
  • VirtualStringTree 正确/推荐使用

    我已经使用 virtualstringtree 一段时间了 我将它用于两个不同的用途 第一个是用于选择 显示数据的普通树 第二个是作为网格来显示 SQL 语句的输出 我加载到树中的所有数据都来自数据库 对于树示例 我有一个 ParentId
  • 如何使用joda时间将固定的毫秒数格式化为hh:mm:ss?

    我输入了 34600 毫秒 我想以 00 00 34 HH MM SS 的格式输出 为此我应该查看 JDK Joda time 的哪些类 我需要它是高效的 最好是线程安全的 以避免每次解析时创建对象 谢谢 编辑 使用此代码提供时区敏感的结果
  • 来自字符串的文件大小

    我如何从 php 中的字符串中获取 文件大小 我将字符串作为 blob 放入 mysql 数据库中 并且需要存储 blob 的大小 我的解决方案是创建一个临时文件并将字符串放入临时文件中 现在我可以从 字符串 中获取文件大小 但这个解决方案
  • 为什么没有参数标识符的函数在 C++ 中有效?

    给定一个 C 函数 其参数仅为类型且没有标识符 void foo1 int int int cout lt lt called foo1 我可以这样称呼它 int main foo1 10 10 10 为什么这是 C 中的有效构造 这只是
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe
  • 什么是代码页 0?

    我正在使用Delphi函数 StringCodePage 我在 COM 函数 Acrobat Annotation getContents 请参阅我的其他帖子 返回的字符串上调用它 它返回 0 0是什么 安西 代码页 0 是 CP ACP
  • 如何使用 IdTCPClient 等待来自服务器的字符串?

    我的 IdTelnet indy 10 1 有问题 我无法以 Unicode 模式从服务器读取数据 现在我想用 IdTCPClient 编写 telnet 终端 服务器有时发送一行 有时发送越来越多的行 但发送之间没有固定的时间 现在我的问
  • 是否可以在虚拟树视图中选择多个列?

    我需要添加功能来复制节点和列的矩形选择 但我找不到任何方法来实际选择虚拟树视图中的多个列 除了 toFullRowSelect 之外 我只是错过了什么吗 如果没有 是否有一个后代具有类似网格的多列选择支持 经过一些测试后 我得出了以下结论
  • 如何将 Delphi Chromium Embedded (TChromium) 组件的声音静音?

    我需要将某个声音静音TChromium组件来制作无声浏览器 主要问题是在 Windows XP 上 当我将浏览器的声音静音时 它会静音整个系统的声音 有没有办法让电脑静音TChromium成分 我已经成功使用以下代码 procedure C
  • DBX 错误:驱动程序无法正确初始化

    我在跑步德尔福XE3 终极版 MySQL 数据库 这是我点击时收到的错误Test Connection 作为回应 我在 xampp 目录中找到了 libmysql 库 并将其复制到我的 System32 目录中 但这是行不通的 此消息指的是
  • 推荐的 HTML 格式化程序脚本/实用程序? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将双精度数的指数便携式打印到 C++ iostream

    我想打印一个双精度值std cout可移植 GCC clang MSVC 以便所有平台上的输出都相同 我的指数格式有问题 下面的程序 include
  • SSL 错误 1409442E 使用 TIdHTTP 通过 HTTPS 下载文件 [重复]

    这个问题在这里已经有答案了 我正在使用德尔福10 3 3 下面的代码曾经有效 但现在尝试通过 HTTPS 下载文件时遇到错误 连接 SSL 错误错误 1409442E SSL 例程 SSL3 READ BYTES tlsv1 警报协议版本
  • 使用 Inno Setup 中格式化(部分粗体)的文本制作安装程序?

    有人看过 GOG com 游戏安装程序吗 如何制作像这样的欢迎文本字符串 包括单个标题中的路径和需要大小 其中部分内容加粗 以下是修改安装路径后如何更改字符串换行的示例 您可以使用TRichEditViewer http www jrsof
  • 当 datasnap 服务器中的用户授权失败时,是否可以更改响应代码?

    当用户授权失败时 是否可以更改 DataSnap Delphi XE3 服务器中的 HTTP 响应代码 目前正在回归HTTP 1 1 500 内部服务器错误 这可能发生在许多其他场景中 并且无助于描述问题 按照同样的想法 是否可以更改默认的
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 行方向变异的有效方法

    我有两个数据框 dfUsers and purchases使用以下代码生成 set seed 1 library data table dfUsers lt data table user letters 1 5 startDate sam
  • Delphi:如何检查是否按下了任何鼠标按钮 - 在鼠标事件之外?

    我有一个 TDrawGrid 想要处理单击单元格并使用鼠标滚轮滚动单元格的方式略有不同 使用鼠标滚轮滚动时 视图应以选定的单元格为中心 而仅单击单元格时 视图不应居中移动 因为这会令人困惑 用鼠标滚轮滚动会触发OnSelectCell事件
  • VB.NET - 类中的扩展函数?

    我正在尝试创建一个类库 其中包含将二进制整数转换为十进制的函数 反之亦然 这样我就可以将其导入到另一个项目中 而无需重写该函数 它工作得很好 这是课程的一部分 Public Class BinaryDenary Public Shared

随机推荐

  • 信号量和并发编程

    对于家庭作业 我需要编写以下场景 这将通过使用 BACI 的信号量来完成 即 C 有 2 个男女通用卫生间 每个可容纳 4 人 由于它是男女皆宜的 所以只有同性别的人可以同时进入卫生间 先进先出并不重要 我脑子里有一个基本的 算法 可以处理
  • 数据库的 ID 最佳实践 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我想知道构建和存储 ID 的最佳实践是什么 几年前 一位教授以社会安全号码为例 向我讲述了构造不良的身份识别系统的危险 特别是 由于 SSN 没有任何错误检测功能 无法区分 9 位数字符串
  • 如何使用 xcode5 在 mac 应用程序中对捆绑的可执行文件进行代码签名

    我有一个在 xCode 5 中创建的应用程序 其中包含捆绑的可执行文件 我正在尝试将应用程序提交到 Mac 应用程序商店 但是当我提交它时 它失败并显示以下消息 未启用应用程序沙箱 以下可执行文件必须包含 com apple securit
  • 使用回发数据抓取页面 javascript Python Scrapy

    我正在通过 Scrapy 使用 ASP NET 编程爬行一些目录 要爬行的页面编码如下 javascript doPostBack ctl00 MainContent List Page X 其中 X 是 1 到 180 之间的整数 Mai
  • 如何更改 IE 中输入字段中文本光标的颜色?

    据我所知 在 Firefox 和 Chrome 中 输入字段中文本光标的颜色会更改为colorCSS 属性 但在 IE 中却没有任何效果 有没有办法在IE中实现这种效果呢 IE 输入中文本光标的颜色始终与背景颜色相反 所以你不能在IE上 这
  • 具有相互关联的三个表的多对多 (SqlAlchemy)

    我有三个表 用户 设备和角色 我已经创建了一个像这样的用户和设备之间的多对多关系 Many to Many relation between User and Devices userDevices db Table user device
  • 返回由 USING 创建的对象

    我正在使用中创建一个对象 下面的 obj 并将该对象作为函数返回的一部分返回 这会导致任何问题 例如在我尝试在另一个函数中使用返回值之前对象将被处理吗 using MyObject obj new MyObject return obj 这
  • 在 MVVM 世界中更改 CollectionViewSource 源

    Edited 我创建了一个新的 VS2010 WPF 应用程序 仅包含 3 个文件 MainWindow xaml MainWindow xaml cs 和 MainWindowViewModel cs 下面列出 如果有人觉得真的很有帮助
  • 错误:致命:不是 git 存储库(或任何父目录):.git

    当我尝试将图像放入项目的 Resources 文件夹中时 我收到以下消息 致命 不是 git 存储库 或任何父目录 git 我该如何修复它 有同样的问题 我复制了一个项目然后尝试删除文件 如果您希望能够编辑项目 请输入 git initfo
  • 在调用 Objective-C 对象的实例方法时,是否可以释放该对象?

    请考虑以下情况 Objective C 类的实例由一个强引用和一个弱引用 在 ARC 下 引用 在线程 X 上 通过弱引用在实例上调用方法 在线程 Y 上 强引用被破坏 因此不再有对该实例的强引用 并且应该释放该实例 这种情况是否可能 因为
  • Inno Setup:如何查看 Inno Setup 预处理器的输出(翻译)?

    我有一个带有预处理器指令的 Inno Setup 脚本 defines ifs etc 我想在我的脚本上运行 Inno Setup 预处理器并查看预处理器的输出 Inno Setup speak 中的翻译 也就是说 我想查看预处理器的结果
  • Spring Security OAuth2 - @EnableOauth2Sso 但也接受令牌作为身份验证

    我有一个应用程序 EnableOAuth2Sso on the WebSecurityConfigurerAdapter 添加后 EnableOAuth2Sso该应用程序将我重定向到授权服务器 并允许在该授权服务器登录后进行访问 我也想提供
  • 在Python中获取括号内的字符串

    我有一个示例字符串
  • 我应该测试私有方法还是只测试公共方法? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我读过了这个帖子关于如何测试私有方法 我通常不测试它们 因为我一直认为仅测试从对象外部调用的公共方法会更快 你测试私有方法吗 我应该总是测试它们吗 我不对私有方法进行单元测试 私有方法是应
  • 在 Tomcat 中重新部署应用程序时出现内存泄漏

    当我在 tomcat 中重新部署应用程序时 出现以下问题 The web application created a ThreadLocal with key of type java lang ThreadLocal value java
  • 向 Python 脚本发送消息

    我正在尝试编写一个小 python 程序来关闭或重新启动我的 Raspberry PI 由连接到 GPIO 的按钮驱动 该程序可以通过两个 LED 显示树莓派的当前状态 启动 运行 停止 重启 python 程序作为守护进程执行 由 ini
  • C 中的非 void 函数不返回任何内容

    以下代码片段中的最佳实践是什么 int foo struct data bar struct info bla if bar bla gt status 0 return 事实上 它工作得很好 但我感觉不舒服gcc给我一个警告 这是实际的代
  • 如何使用 UIApplicationDelegateAdaptor 作为 ObservableObject?

    在我的 iOS 14 中App 我可以登记遗产AppDelegate通过做这个 main struct MyApp App if os iOS UIApplicationDelegateAdaptor AppDelegate self va
  • Python如何从文件中读取原始二进制文件? (音频/视频/文字)

    我想读取文件的原始二进制文件并将其放入字符串中 目前 我正在打开一个带有 rb 标志的文件并打印字节 但它显示为 ASCII 字符 对于文本 即视频和音频文件 它给出符号和乱码 如果可能的话 我想得到原始的 0 和 1 这也需要适用于音频和
  • Delphi函数像Windows一样显示字节数

    这是一个简单的问题 我认为 是否有一个系统内置函数 或者某人创建的可以从 Delphi 调用的函数 它将显示多个字节 例如文件大小 就像 Windows 在文件属性框中显示的方式一样 例如这是 Windows 属性框显示各种尺寸的方式 53