如何将long修改为字符串和字符串以完全双重转换?

时间:2014-03-07 17:18:11

标签: vb.net

我正在尝试修复两个警告。第一个警告是oInfo.Length上从long到string的隐式转换。第二个是'strSize'上从字符串到double的隐式转换。这是一个旧的.NET 1项目,我试图转换为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

3 个答案:

答案 0 :(得分:3)

oInfo.LengthSystem.IO.FileInfo.Length,这是一个很长的。

因此,您不能将{s}一次作为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

答案 1 :(得分:1)

如下所示。请注意,如果它是一个数字,它应该存储在为数字设计的数据类型中。数字应存储在字符串中的时间用于显示目的(例如逗号分隔,单位等)

Dim FInfo As New System.IO.FileInfo(Server.MapPath(strVirtualPath))
Dim Result As String
Try
    If oInfo.Exists Then
        Dim FileSize = FInfo.Length
        If FileSize < 1048576 Then
            Result = System.Math.Round(FileSize / 1024, 2) & " kb"
        Else
            Result = System.Math.Round(FileSize / 1048576, 2) & " mb"
        End If
    End If
Catch ex As Exception
    ....

请注意,这仍然不够(除非您知道,否则您将永远不会获得小于1KB或大于1GB的文件)。一个更好的解决方案可以是found here

编辑:回应AndréFigueiredo... 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

_dataInitialised似乎是由(本机)基类设置的,所以我无法看到它何时被设置。人们希望它在建设中,但似乎并非如此,因为它在许多地方进行了检查。

当然,由于OP似乎正在使用Option Strict = False,因为所有类型检查都会增加约30%的性能损失,这一切都没有实际意义。

答案 2 :(得分:0)

从这里开始:

Dim strSize As Double