2012-11-23 82 views
0

我有這個功能在bin文件中寫入字節。VB.NET加速循環功能

Public Shared Function writeFS(path As String, count As Integer) As Integer 
     Using writer As New BinaryWriter(File.Open(path, FileMode.Open, FileAccess.Write, FileShare.Write), Encoding.ASCII) 
      Dim x As Integer 
      Do Until x = count 
       writer.BaseStream.Seek(0, SeekOrigin.End) 
       writer.Write(CByte(&HFF)) 
       x += 1 
      Loop 
     End Using 
     Return -1 
    End Function 

我有一個文本框即是count值。計數是要寫入文件的字節數。

問題是當我想寫1mb +因爲週期需要10+秒。

我需要更好/更快的方式在文件'value'次的末尾寫入十六進制值FF

對不起,如果我沒有解釋得很好。

+0

你爲什麼要這樣做'writer.BaseStream.Seek(0,SeekOrigin.End)'? –

+0

在文件末尾處去。 – Fr0z3n

+0

您是追加到現有文件還是創建一個新文件?請注意,在每個「Write」之後,它已經在文件的末尾。 –

回答

3

這應該會更好:

Public Shared Function writeFS(path As String, count As Integer) As Integer 
    Using writer As New BinaryWriter(File.Open(path, FileMode.Open, FileAccess.Write, FileShare.Write), Encoding.ASCII) 
     Dim x As Integer 
     Dim b as Byte 
     b = CByte(&HFF) 
     writer.BaseStream.Seek(0, SeekOrigin.End) 
     Do Until x = count 
      writer.Write(b) 
      x += 1 
     Loop 
    End Using 
    Return -1 
End Function 

這樣,你不是每次通話CByte。並且在每次寫入之後不需要移動到流的末尾。

+0

是的,但在開始寫入之前,我需要在文件的末尾處去,否則將覆蓋文件開頭的現有數據。寫作前我只能做一次? – Fr0z3n

+0

@DjRikyx好的,在循環之前放入'writer.BaseStream.Seek(0,SeekOrigin.End)'。 (編輯我的答案) –

+0

好的,謝謝!現在是完美的,不花時間:) – Fr0z3n

0

之前的一些問題: 爲什麼函數Shared?爲什麼使用FileSHARE.Write? WriteShare意味着OTHER寫入時可以寫入文件。你爲什麼寫單個字節都是一樣的?爲什麼函數每次都返回-1?可能更適合與SUB?爲什麼不使用簡單的for循環呢?

Public Sub writeFS(path As String, count As Integer) 
    Using Stream As New FileStream("", FileMode.Append, FileAccess.Write, FileShare.Read) 
     Stream.Write(Enumerable.Repeat(Of Byte)(255, count).ToArray, 0, count) 
    End Using 
End Sub 

好的,如果你需要寫100MB,這不合適,但是你可以分割你的寫入。

+0

它是共享因爲是外部類的一部分。我使用文件共享,因爲其他程序需要完全訪問同一個文件。這裏發佈的功能不完整。我只寫了我需要幫助的部分。然而你的問題與這個問題無關。但是,謝謝你的方法,它的工作原理。 – Fr0z3n