Vb.net 如何干净地修复长到字符串和字符串到双精度的转换?

Vb.net 如何干净地修复长到字符串和字符串到双精度的转换?,vb.net,Vb.net,我正试图修正两个警告。第一个警告是oInfo.Length上从long到string的隐式转换。第二个是在“strSize”上从字符串到双精度的隐式转换。这是一个旧的.NET1项目,我正在尝试转换为4.0。如何在保持逻辑的同时修复这些警告 Dim oInfo As New System.IO.FileInfo(Server.MapPath(strVirtualPath)) Dim strSize As String = "" Try If oInfo.Exist

我正试图修正两个警告。第一个警告是oInfo.Length上从long到string的隐式转换。第二个是在“strSize”上从字符串到双精度的隐式转换。这是一个旧的.NET1项目,我正在尝试转换为4.0。如何在保持逻辑的同时修复这些警告

 Dim oInfo As New System.IO.FileInfo(Server.MapPath(strVirtualPath))
    Dim strSize As String = ""
    Try
        If oInfo.Exists Then
            strSize = **oInfo.Length**
            If **strSize** < 1048576 Then
                strSize = System.Math.Round(Convert.ToInt64(strSize) / 1024, 2) & " kb"
            Else
                strSize = System.Math.Round(Convert.ToInt64(strSize) / 1048576, 2) & " mb"
            End If
        End If
    Catch ex As Exception
Dim oInfo作为新的System.IO.FileInfo(Server.MapPath(strVirtualPath))
Dim strSize As String=“”
尝试
如果oInfo.存在,则
strSize=**oInfo.Length**
如果**标准化**<1048576,则
strSize=System.Math.Round(转换为64(strSize)/1024,2)和“kb”
其他的
strSize=System.Math.Round(转换为64(strSize)/1048576,2)和“mb”
如果结束
如果结束
特例
从这里开始:

Dim strSize As Double

类似下面的内容。注意,如果它是一个数字,它应该存储在为数字设计的数据类型中。数字存储在字符串中的唯一时间是为了显示(例如逗号分隔、单位等)

Dim FInfo作为新的System.IO.FileInfo(Server.MapPath(strVirtualPath))
将结果变暗为字符串
尝试
如果oInfo.存在,则
Dim FileSize=FInfo.Length
如果文件大小<1048576,则
结果=System.Math.Round(文件大小/1024,2)和“kb”
其他的
结果=System.Math.Round(文件大小/1048576,2)和“mb”
如果结束
如果结束
特例
....
请注意,这仍然不够(除非您知道永远不会得到小于1KB或大于1GB的文件)。可以找到更好的解决方案

编辑:回应安德烈·菲格雷多。。。FileInfo.Length定义为:

Public ReadOnly Property Length() As Long
    <SecuritySafeCritical()>
    Get
        If Me._dataInitialised = -1 Then
            MyBase.Refresh()
        End If
        If Me._dataInitialised <> 0 Then
            __Error.WinIOError(Me._dataInitialised, MyBase.DisplayPath)
        End If
        If(Me._data.fileAttributes And 16) <> 0 Then
            __Error.WinIOError(2, MyBase.DisplayPath)
        End If
        Return CLng(Me._data.fileSizeHigh) << 32 Or (CLng(Me._data.fileSizeLow) And CLng((CULng(-1))))
    End Get
End Property
Public ReadOnly属性长度()尽可能长
得到
如果Me.\u datainitialized=-1,则
MyBase.Refresh()
如果结束
如果我.\u数据初始化为0,则
__Error.WinIOError(Me.\u数据初始化,MyBase.DisplayPath)
如果结束
如果(Me._data.fileAttributes和16)0,则
__Error.WinIOError(2,MyBase.DisplayPath)
如果结束

Return CLng(Me.\u data.fileSizeHigh)
oInfo.Length
指的是一个长字符

因此,您不能将strize作为
Long
播放一次,而将其作为
String
播放一次

事实上,您甚至不需要将
oInfo.Length
存储到另一个变量中。它在对象创建中填充(当FileInfo从文件检索信息时)。这样做,您不需要将值转换为Long

我会将此代码重写为:

Dim oInfo As New System.IO.FileInfo(Server.MapPath(strVirtualPath))
Dim strSize As String = ""

Try
    If oInfo.Exists Then
        If oInfo.Length < 1048576 Then
            strSize = System.Math.Round(oInfo.Length / 1024, 2) & " KB"
        Else
            strSize = System.Math.Round(oInfo.Length / 1024 / 1024, 2) & " MB"
        End If
    End If
Catch ex As Exception
Dim oInfo作为新的System.IO.FileInfo(Server.MapPath(strVirtualPath))
Dim strSize As String=“”
尝试
如果oInfo.存在,则
如果信息长度小于1048576,则
strSize=System.Math.Round(oInfo.Length/1024,2)和“KB”
其他的
strSize=System.Math.Round(oInfo.Length/1024/1024,2)和“MB”
如果结束
如果结束
特例

如果strSize<1048576,那么
这将如何工作?使用正确的数据类型…我不得不指出,“kb”和“mb”是小写,正确的是大写(即10 mb,20 kb)。使用选项Strict-always
如果strize<10485761
如果“cat”<15大致相同,则
否。。。这是一个很长的链接(如您链接的页面所示)。将长度存储在变量中的原因是为了避免查询文件系统twice@Basic,关于查询系统两次。。不,这是错的。。FileInfo属性通过在创建对象时查询系统来填充。之后,它将值存储在变量
oInfo
中。i、 e.如果文件大小在两次调用
长度的调用之间发生变化,应用程序将不知道这一点,并且仍然会通知旧值。@AndréFigueiredo实际上,我们都部分正确。。如果磁盘已经初始化,它不会从磁盘读取,但会有一些开销。。。我已经把它的实际作用写进了我的答案中
Dim oInfo As New System.IO.FileInfo(Server.MapPath(strVirtualPath))
Dim strSize As String = ""

Try
    If oInfo.Exists Then
        If oInfo.Length < 1048576 Then
            strSize = System.Math.Round(oInfo.Length / 1024, 2) & " KB"
        Else
            strSize = System.Math.Round(oInfo.Length / 1024 / 1024, 2) & " MB"
        End If
    End If
Catch ex As Exception