Цикл файла в VB.NET - PullRequest
       8

Цикл файла в VB.NET

1 голос
/ 11 июня 2010

Я пишу программу на VB.NET и пытаюсь выполнить следующее:

  • Чтение и циклический просмотр текстового файла строка за строкой
  • Показать событиецикл в текстовом поле или метке, пока не будет нажата кнопка
  • Затем цикл остановится на любом числе, которое произошло в событии цикла, и
  • При повторном нажатии кнопки цикл будетПродолжить.

Код

Imports System.IO    
Public Class Form1


'Dim nFileNum As Integer = FreeFile() ' Get a free file number
Dim strFileName As String = "C:\scb.txt"
Dim objFilename As FileStream = New FileStream(strFileName, _
    FileMode.Open, FileAccess.Read, FileShare.Read)
Dim objFileRead As StreamReader = New StreamReader(objFilename)
'Dim lLineCount As Long
'Dim sNextLine As String


Private Sub btStart_Click(ByVal sender As System.Object, _ 
                          ByVal e As System.EventArgs) _
     Handles btStart.Click

    Try
        If objFileRead.ReadLine = Nothing Then

            MsgBox("No Accounts Available to show!", _
               MsgBoxStyle.Information, _
               MsgBoxStyle.DefaultButton2 = MsgBoxStyle.OkOnly)
            Return
        Else

            Do While (objFileRead.Peek() > -1)

            Loop
            lblAccounts.Text = objFileRead.ReadLine()

            'objFileRead.Close()
            'objFilename.Close()
        End If

    Catch ex As Exception
        MessageBox.Show(ex.Message)
    Finally
        'objFileRead.Close()
        'objFilename.Close()
    End Try


End Sub

Private Sub Form1_Load(ByVal sender As System.Object, _ 
                       ByVal e As System.EventArgs) _
  Handles MyBase.Load

End Sub
End Class

Проблема

Я могу прочитать текстовый файл, но моя метка будет зацикливаться, только если я нажму кнопку запуска.Он переходит к следующей строке, но я хочу, чтобы он продолжал перебирать весь файл до тех пор, пока не нажму кнопку, сообщающую об остановке.

Ответы [ 2 ]

0 голосов
/ 11 июня 2010

Вы должны использовать Background-Worker для такого рода заданий, также я бы не стал читать файл напрямую, я бы его кешировал.

Imports System.IO

' --> Private Declaration in the Form '
Private _path As String = "YourPathHere"
Private _lines() As String = File.ReadAllLines(Me._path)
Private _lineCounter As Integer = 0
Private _loop As Boolean = True

' --> BackgroundWorker-DoWork-Event '
While Me._loop
    Me._lineCounter += 1
    If Me_linceCounter >= Me._lines.Length Then Me._lineCounter = 0
    Me.BackgroundWorker.ReportProgress(0)
End While

' --> BackgroundWorker-ProgressChanged-Event '
Me.YourTextBoxHere.Text = Me._lines(_lineCounter)

' --> Button-Click-Event '
If Me._loop Then
    Me._loop = False
Else
    Me._loop = True
    Me.BackgroundWorker.RunWorkerAsync()
End If

Редактировать:

  Private Sub BGW_DoWork(ByVal sender As Object, _
                         ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork
        While Me._loop
              Me._lineCounter += 1
              If Me_linceCounter >= Me._lines.Length Then Me._lineCounter = 0
              Me.BackgroundWorker.ReportProgress(0)
        End While
  End Sub

То же самое относится и к событию ProgressChanged.

Edit2: И не забудьте установить свойство WorkerReportsProgress на True.

0 голосов
/ 11 июня 2010

Я могу сказать вам одну вещь, это:

lblAccounts.Text = objFileRead.ReadLine()

должно быть внутри цикл Do While:

Do While (objFileRead.Peek() > -1)
    lblAccounts.Text = objFileRead.ReadLine()
Loop

Отредактировано вadd

Код выше на самом деле не полезен.Текстовый файл будет читаться так быстро, что в lblAccounts будет отображаться только последняя строка.

Вы можете по крайней мере увидеть пролетающие имена, если вы сделаете следующее:

Do While (objFileRead.Peek() > -1)
    lblAccounts.Text = objFileRead.ReadLine()
    lblAccounts.Update()
    Application.DoEvents()
Loop

Это должно датьВы подсказываете об остановке и запуске.Вот псевдокод:

dim Runnning as boolean = false ' global
sub button_handler()
    if Running then
        Running = false
    else
        Running = true
        KeepReading()
    end if
end sub

sub KeepReading()
    Do While (objFileRead.Peek() > -1 and Running)
        lblAccounts.Text = objFileRead.ReadLine()
        lblAccounts.Update()

        ' this will let the screen update, also let button
        ' messages through:
        Application.DoEvents() 
    Loop
    if running then
        MsgBox("Done!")
        Running = false
    end if
end sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...