2012-11-23 81 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