2014-03-07 66 views
-1

我在解決兩個警告。第一個警告是在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 
+1

'如果了strsize <1048576 Then'這是怎麼預期工作?使用正確的數據類型... – Basic

+0

我不禁要注意「kb」和「mb」是小寫,正確的是大寫(即10 MB,20 KB)。 http://physics.nist.gov/cuu/Units/binary.html http://en.wikipedia.org/wiki/Binary_prefix –

+1

使用Option Strict - always。 '如果strSize <10485761'與'If「cat <<15那麼' – Plutonix

回答

3

oInfo.Length是指System.IO.FileInfo.Length,這是一個很長的。

所以,你不能像stripeSize一樣播放Long,其他的String

實際上,你甚至不需要將oInfo.Length存儲到另一個變量中。它填充在對象創建中(當FileInfo從文件中檢索信息時)。這樣做,您不需要將值轉換爲長。

我想改寫這個代碼:

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 
+0

' ... System.IO.FileInfo.Length,它是一個double.'不是...它是一個Long(如圖所示您鏈接的頁面)。將長度存儲在變量中的原因是爲了避免查詢文件系統兩次 – Basic

+0

謝謝!這工作完美! – derekjs67

+0

哦,我的錯誤,我修正了數據類型.. –

0

從這裏開始:

Dim strSize As Double 
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

編輯:爲響應安德烈·菲格雷多... 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%的性能損失,所以這一切都沒有實際意義。

相關問題