VB.NET多线程文件读写

前端之家收集整理的这篇文章主要介绍了VB.NET多线程文件读写前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

现在,流行的下载工具都使用了多线程的方式,这样比单线程下载快了很多。

不过那些通常都不是用VB.NET写的,网上可以找到的这方面的资料也比较少。自己琢磨了几天,同时也借助于网友的帮助,解决了这个问题。

下边上代码

Imports System.IO
Imports System.Threading
Imports System.Text
Public Class Form1
    Private p As String = "" '文件路径
    Private fLength As Integer
    Private fl As Integer = 102400 '定义缓冲区大小
    Private fStart As Integer = 0 '定义读取起始位置
    Private m As Integer = 1
    Private fCount As Integer = 0 '分块数
    Private cInte As Integer = 0 '当前块

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        OpenFileDialog1.ShowDialog()
        TextBox1.Text = OpenFileDialog1.FileName
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button2.Click
        p = TextBox1.Text
        Dim a As New FileInfo(p)
        fLength = a.Length
        fStart = 0
        Dim u As Thread
        fStart = -fl
        Dim c,d As Double
        c = Int(fLength / fl)
        d = fLength / fl
        If c < d Then
            fCount = c + 1
        Else
            fCount = d
        End If
        For i As Integer = 1 To ThreadCount.Text
            u = New Thread(AddressOf Work)
            u.IsBackground = True
            u.Name = i
            u.Start()
        Next
    End Sub

    Sub Work()
        SyncLock Thread.CurrentThread
            Do While Not cInte >= fCount
                fStart += fl
                cInte += 1
                ReadData(fStart,fl,cInte)
            Loop
            If cInte = fCount Then
                Dim temppath As String = "E:\1\"
                '========合并文件=========
                Dim pm As New System.Diagnostics.Process()
                pm.StartInfo.FileName = "cmd.exe"
                pm.StartInfo.UseShellExecute = False
                pm.StartInfo.CreateNoWindow = True
                pm.StartInfo.RedirectStandardInput = True
                pm.StartInfo.RedirectStandardOutput = True
                pm.Start()
                Dim temp As String = ""
                Dim fEx As New FileInfo(p)

                For i As Integer = 1 To fCount
                    If temp = "" Then
                        temp = "E:\1\" & fEx.Name.Replace(fEx.Extension,"." & i & fEx.Extension)
                    Else
                        temp = temp & " + " & "E:\1\" & fEx.Name.Replace(fEx.Extension,"." & i & fEx.Extension)
                    End If
                Next
                'MsgBox(temp)
                pm.StandardInput.WriteLine("copy /b " & temp & " " & temppath & "OK.txt")
                pm.StandardInput.WriteLine("exit")
                pm.WaitForExit()
            End If
        End SyncLock
    End Sub

    '读取指定位置的内容
    Sub ReadData(ByVal Start As Integer,ByVal l As Integer,ByVal cuinte As Integer)
        Dim u As New FileStream(p,FileMode.Open,FileAccess.Read)

        Dim sBy(l - 1) As Byte
        u.Seek(Start,SeekOrigin.Begin)
        u.Read(sBy,sBy.Length)
        u.Close()
        u.Dispose()
        writeData(cuinte,sBy)
    End Sub


    '写文件
    Sub writeData(ByVal cuinte As Integer,ByVal data As byte())
        Try
             Dim fEx As New FileInfo(p)
             Dim TEMP As String = "c:\" & fEx.Name.Replace(fEx.Extension,"." & cuinte & fEx.Extension)
			 Dim u As New FileStream(TEMP,FileMode.OpenOrCreate,FileAccess.Write)
			 Dim Bw As New System.IO.BinaryWriter(u)
			 Bw.Write(data)
			 u.Close()
			 u.Dispose()
			 Bw.Close() 

        Catch ex As Exception
            Err.Clear()
            Exit Sub
        End Try
    End Sub


    Private Sub Form1_FormClosing(ByVal sender As Object,ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        End
    End Sub


在写上边代码的时候,碰到了一个文件拆分后再合并后,文件被损坏的问题,详见:http://topic.csdn.net/u/20100716/11/4addfa0d-db8e-4604-9e7b-f2e14958a59e.html

在此也感谢各位网友的帮助

原文链接:/vb/260241.html

猜你在找的VB相关文章