我正在尝试修复两个警告。第一个警告是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
答案 0 :(得分:3)
oInfo.Length
指System.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