vb.net 如何使用公共函数从字节返回 KB、MB 和 GB
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/27367190/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to return KB, MB and GB from Bytes using a public function
提问by Mean Mr Mustard
I'm writing a "function" that returns a file's size (in B, KB, MB, GB).
我正在编写一个返回文件大小(以 B、KB、MB、GB 为单位)的“函数”。
The VB.Net code always gets the size in bytes first, so when a file's size (in Bytes) is less than 100 it returns B, if its > 1000 then I divide it by 1000 and it returns KB. But when it should be MB I try dividing by 1000000 and the size it returns always comes out 2 MBs bigger than what it should be!?
VB.Net 代码总是首先获取以字节为单位的大小,因此当文件的大小(以字节为单位)小于 100 时,它返回 B,如果它 > 1000,那么我将它除以 1000,它返回 KB。但是当它应该是 MB 时,我尝试除以 1000000,它返回的大小总是比它应该的大小大 2 MB!?
Can someone please tell me what I'm doing wrong!!
有人可以告诉我我做错了什么!!
Example
例子
My files size is (15,570,550 Bytes) ..which is.. (14.8 MB)
我的文件大小是 (15,570,550 Bytes) ..which is.. (14.8 MB)
So when i run it through this function it returns 16MB!
所以当我通过这个函数运行它时,它返回 16MB!
The Code
编码
Public Function GetFileSize(ByVal TheFile As String, _
Optional ByVal ShowSizeType As Boolean = False) As String
If TheFile.Length = 0 Then Return ""
If Not System.IO.File.Exists(TheFile) Then Return ""
'---
Dim TheSize As Integer = My.Computer.FileSystem.GetFileInfo(TheFile).Length
Dim SizeType As String = ""
'---
If TheSize < 1000 Then
SizeType = "B"
Else
If TheSize < 1000000000 Then
If TheSize < 1000000 Then
SizeType = "KB"
TheSize = TheSize / 1000
Else
SizeType = "MB"
TheSize = TheSize / 1000000
End If
Else
SizeType = "GB"
End If
End If
'---
If ShowSizeType = True Then
Return TheSize & SizeType
Else
Return TheSize
End If
End Function
回答by Creator
I would use a select case for it and not a if.
And always start with the biggest size." i stopped at TB but of Corse you can add more if you need ..."
我会为它使用一个选择案例,而不是一个如果。
并且总是从最大的尺寸开始。”我停在 TB 但如果你需要,你可以添加更多的 Corse ......”
I changed Dim TheSize As Integer to "Dim TheSize As ULong " otherwise big numbers don't work.
我将 Dim TheSize As Integer 更改为“Dim TheSize As ULong”,否则大数字不起作用。
Also make a dim "Dim DoubleBytes As Double" you will use it in the select case.
还要制作一个暗淡的“Dim DoubleBytes As Double”,您将在选择的情况下使用它。
First you compare the bytes you have with a case , lets say mb "Case 1048576 To 1073741823"
So if this is the case convert TheSize to a double "DoubleBytes = CDbl(TheSize / 1048576) 'MB
"
首先,您将拥有的字节与 case 进行比较,让我们说 mb "Case 1048576 To 1073741823"
所以如果是这种情况,请将 TheSize 转换为 double "DoubleBytes = CDbl(TheSize / 1048576) 'MB "
Then in the return you use FormatNumber to set the number you want to show behind the . "the nuber 2 is to set it to 2 behind the . like 28.11 , change it to 0 and it will return 28" also because you know it mb you wil add & mb to the return.
"Return FormatNumber(DoubleBytes, 2) & " MB"
"
然后在返回时使用 FormatNumber 设置要显示在 . “nuber 2 是将它设置为 2 后面的 . 就像 28.11 ,将其更改为 0 它将返回 28”,因为您知道它 mb 您将添加 & mb 到返回。
"返回 FormatNumber(DoubleBytes, 2) & " MB" "
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MsgBox(GetFileSize("E:\Software\TeamSpeak3-Client-win64-3.0.14.exe"))
End Sub
Dim DoubleBytes As Double
Public Function GetFileSize(ByVal TheFile As String) As String
If TheFile.Length = 0 Then Return ""
If Not System.IO.File.Exists(TheFile) Then Return ""
'---
Dim TheSize As ULong = My.Computer.FileSystem.GetFileInfo(TheFile).Length
Dim SizeType As String = ""
'---
Try
Select Case TheSize
Case Is >= 1099511627776
DoubleBytes = CDbl(TheSize / 1099511627776) 'TB
Return FormatNumber(DoubleBytes, 2) & " TB"
Case 1073741824 To 1099511627775
DoubleBytes = CDbl(TheSize / 1073741824) 'GB
Return FormatNumber(DoubleBytes, 2) & " GB"
Case 1048576 To 1073741823
DoubleBytes = CDbl(TheSize / 1048576) 'MB
Return FormatNumber(DoubleBytes, 2) & " MB"
Case 1024 To 1048575
DoubleBytes = CDbl(TheSize / 1024) 'KB
Return FormatNumber(DoubleBytes, 2) & " KB"
Case 0 To 1023
DoubleBytes = TheSize ' bytes
Return FormatNumber(DoubleBytes, 2) & " bytes"
Case Else
Return ""
End Select
Catch
Return ""
End Try
End Function
I made a dll for it.
Then I can import it to my project and I can call it whenever I need to change a byte number to something else "like mb etc"
FormatBytes(GetHDSizeF) "GetHDSizeF is the number of bytes"
我为它制作了一个dll。
然后我可以将它导入到我的项目中,我可以在需要将字节数更改为其他内容时调用它“例如 mb 等”
FormatBytes(GetHDSizeF) “GetHDSizeF 是字节数”
Dim DoubleBytes As Double
Default Public Property FormatBytes(ByVal BytesCaller As ULong) As String
Get
Try
Select Case BytesCaller
Case Is >= 1099511627776
DoubleBytes = CDbl(BytesCaller / 1099511627776) 'TB
Return FormatNumber(DoubleBytes, 2) & " TB"
Case 1073741824 To 1099511627775
DoubleBytes = CDbl(BytesCaller / 1073741824) 'GB
Return FormatNumber(DoubleBytes, 2) & " GB"
Case 1048576 To 1073741823
DoubleBytes = CDbl(BytesCaller / 1048576) 'MB
Return FormatNumber(DoubleBytes, 2) & " MB"
Case 1024 To 1048575
DoubleBytes = CDbl(BytesCaller / 1024) 'KB
Return FormatNumber(DoubleBytes, 2) & " KB"
Case 0 To 1023
DoubleBytes = BytesCaller ' bytes
Return FormatNumber(DoubleBytes, 2) & " bytes"
Case Else
Return ""
End Select
Catch
Return ""
End Try
End Get
Set(value As String)
End Set
End Property
And if you don't want to make a dll you can use it like a normal function like this.
如果您不想制作 dll,您可以像这样使用普通函数一样使用它。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
MsgBox(FormatBytes(2000))
End Sub
Dim DoubleBytes As Double
Public Function FormatBytes(ByVal BytesCaller As ULong) As String
Try
Select Case BytesCaller
Case Is >= 1099511627776
DoubleBytes = CDbl(BytesCaller / 1099511627776) 'TB
Return FormatNumber(DoubleBytes, 2) & " TB"
Case 1073741824 To 1099511627775
DoubleBytes = CDbl(BytesCaller / 1073741824) 'GB
Return FormatNumber(DoubleBytes, 2) & " GB"
Case 1048576 To 1073741823
DoubleBytes = CDbl(BytesCaller / 1048576) 'MB
Return FormatNumber(DoubleBytes, 2) & " MB"
Case 1024 To 1048575
DoubleBytes = CDbl(BytesCaller / 1024) 'KB
Return FormatNumber(DoubleBytes, 2) & " KB"
Case 0 To 1023
DoubleBytes = BytesCaller ' bytes
Return FormatNumber(DoubleBytes, 2) & " bytes"
Case Else
Return ""
End Select
Catch
Return ""
End Try
End Function
回答by rory.ap
You need to divide by 1024 not 1000. 1 KB is not 1000 Bytes, it's 1024 bytes. 1 MB is not 1000 KB, it's 1024 KB, and so on.
您需要除以 1024 而不是 1000。1 KB 不是 1000 字节,而是 1024 字节。1 MB 不是 1000 KB,而是 1024 KB,依此类推。
Here's a good site to explain all this: http://pc.net/helpcenter/answers/why_1024_bytes
这是一个很好的网站来解释这一切:http: //pc.net/helpcenter/answers/why_1024_bytes
回答by Safwan
Here is how I do it, below is a VBA function that I use in Microsoft Access that can easily be converted to VB or VBScript, etc.
这是我的做法,下面是我在 Microsoft Access 中使用的 VBA 函数,可以轻松转换为 VB 或 VBScript 等。
Public Function FormatFileSize(ByVal lngFileSize As Long) As String
Dim x As Integer: x = 0
Dim Suffix As String: Suffix = ""
Dim Result As Single: Result = lngFileSize
Do Until Int(Result) < 1000
x = x + 1
Result = Result / 1024
Loop
Result = Round(Result, 2)
Select Case x
Case 0
Suffix = "Bytes"
Case 1 'KiloBytes
Suffix = "KB"
Case 2 'MegaBytes
Suffix = "MB"
Case 3 'GigaBytes
Suffix = "GB"
Case 4 'TeraBytes
Suffix = "TB"
Case 5 'PetaBytes
Suffix = "PB"
Case 6 'ExaBytes
Suffix = "EB"
Case 7 'ZettaBytes
Suffix = "ZB"
Case 8 'YottaBytes
Suffix = "YB"
Case Else
Suffix = "Too big to compute :)"
End Select
FormatFileSize = Format(Result, "#,##0.00") & " " & Suffix
End Function 'FormatFileSize
回答by Steve Lind
this post helped me out when I was trying to sort this out Learning C#, I usually use VB. Anyway I thought I'd post my update in case anyone cares to use it. It is in VB as I have a library of useful Functions and Subs that I use to keep this stuff in, And I started it in VB and too lazy to change all that code. It works well for me, so I hope it helps someone out.
当我试图解决这个问题时,这篇文章帮助了我学习 C#,我通常使用 VB。无论如何,我想我会发布我的更新,以防有人愿意使用它。它在 VB 中,因为我有一个有用的函数和子库,我用它来保存这些东西,而且我在 VB 中启动它并且懒得更改所有代码。它对我来说效果很好,所以我希望它可以帮助别人。
Function ByteConv(Bytes As Double, Optional Style As Integer = 1) As String
Dim count As Integer = 0
Dim factor As Integer = 1024
Dim Workingnum As Double = Bytes
Dim Suffix() As String = {"Bytes", "Kb", "Mb", "Tb", "Pb", "Eb"} 'Dimention the string array upto Exobyte .. Cos why not?'
If Style - 1 Then factor = 1000 Else factor = 1024 'This allows for Function to be used for Comms Calculations. I.e So it returns 100MB connection rather than 95.37'
While Workingnum > factor And count < 5 'Basically keep dividing the Bytecount by the factor until the result reaches a whole number less that the factor itself'
Workingnum = Workingnum / factor ' '
count = count + 1
End While
Return Workingnum.ToString("N") + Suffix(count) ' Then return a string that includes the result and the applicable suffix.'
End Function
回答by Visual Vincent
This is an example of what I meant in my comment:
这是我在评论中的意思的一个例子:
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
Dim CalculatedSize As Decimal
Dim TheSize As Long = Long.Parse(My.Computer.FileSystem.GetFileInfo(OpenFileDialog1.FileName).Length)
Dim SizeType As String = "B"
If TheSize < 1024 Then
CalculatedSize = TheSize
ElseIf TheSize > 1024 AndAlso TheSize < (1024 ^ 2) Then 'KB
CalculatedSize = Math.Round((TheSize / 1024), 2)
SizeType = "KB"
ElseIf TheSize > (1024 ^ 2) AndAlso TheSize < (1024 ^ 3) Then 'MB
CalculatedSize = Math.Round((TheSize / (1024 ^ 2)), 2)
SizeType = "MB"
ElseIf TheSize > (1024 ^ 3) AndAlso TheSize < (1024 ^ 4) Then 'GB
CalculatedSize = Math.Round((TheSize / (1024 ^ 3)), 2)
SizeType = "GB"
ElseIf TheSize > (1024 ^ 4) Then 'TB
CalculatedSize = Math.Round((TheSize / (1024 ^ 4)), 2)
SizeType = "TB"
End If
MessageBox.Show("File size is: " & CalculatedSize.ToString & " " & SizeType, "File size", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub
Result:
结果: