tags:

views:

500

answers:

4

I have many text files in a folder. What I can do now is to read through one text at a time and insert it into the database. My little app reads a text file when I debug it. So, I need to run it several times to read all those text files and import them into the database.

My question is how to read multiple text files inside a folder at a time. Here's my code which works fine but it reads only one text files at a time.

Private Sub btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRead.Click

        Dim filelocation As String
        filelocation = "F:\txtfiles\ch25.txt"
        Dim chid As Integer
        chid = 25



        'read from file'
        Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation))
        Dim vArray() As String = MyStream.ReadToEnd.Split(CChar("$"))
        MyStream.Close()



        Dim count As Integer

        'insert text to table'
        For d As Integer = 0 To vArray.Length - 1 Step 1

            If d = vArray.Length - 1 Then
                Exit For
            End If

            InsertKh(chid, d + 1, vArray(d))
            count = d + 1
        Next


       MsgBox ("Done Inserting")

End Sub

Obviously, I need a way to loop through a folder and check if there's text file. But I cant get it right. Can anyone show me some code or links ? I'm using VB.NET, .NET 3.5

Thanks so much.

+1  A: 

I would look into using the ThreadPool.QueueUserWorkItem. Basically you'll want to read all the files in the Folder and enqueue each file for processing. You'll have to construct a method that can process each file individually as its own sub routine.

bendewey
Alright, I'm reading the link you posted. Thanks.
Angkor Wat
I may have taken your question to the next step. My recommendation is in regards to multi-threading the reading of your files to improve performance.
bendewey
@bendewey, I agree, I think his question centered around functionality, not performance.
Nathan Koop
+5  A: 

Look into Directory.GetFiles.

You can call it with a specified search pattern like "*.txt" to find a specific kind of file. Something like this:

    Dim fileEntries As String() = Directory.GetFiles(targetDirectory,"*.txt")
    ' Process the list of .txt files found in the directory. '
    Dim fileName As String
    For Each fileName In fileEntries
        ProcessFile(fileName)
JeffH
+1  A: 
Private Sub btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRead.Click

Dim di As New DirectoryInfo("F:\txtfiles")
Dim s As String

ForEach s In di.GetFiles("*.txt")
    Private Sub btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRead.Click
        Dim filelocation As String
        filelocation = s ''"F:\txtfiles\ch25.txt"
        Dim chid As Integer
        chid = 25



        'read from file'
        Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation))
        Dim vArray() As String = MyStream.ReadToEnd.Split(CChar("$"))
        MyStream.Close()



        Dim count As Integer

        'insert text to table'
        For d As Integer = 0 To vArray.Length - 1 Step 1

            If d = vArray.Length - 1 Then
                Exit For
            End If

            InsertKh(chid, d + 1, vArray(d))
            count = d + 1
        Next


      '' MsgBox ("Done Inserting")


    End Sub
BobbyShaftoe
+1  A: 

Use the Directory.GetFiles method to find all text files in a folder:

Private Sub btnRead_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRead.Click

   Dim files As String() = System.IO.Directory("F:\txtfiles\", "*.txt")

   Dim count As Integer = 0

   ForEach filelocation As String in files

      Dim chid As Integer = 25

      'read from file'
      Dim MyStream As New StreamReader(filelocation)
      Dim vArray() As String = MyStream.ReadToEnd.Split("$"C)
      MyStream.Close()

      'insert text to table'
      For d As Integer = 0 To vArray.Length - 2
         InsertKh(chid, d + 1, vArray(d))
         count = count + 1
      Next

   Next

   MsgBox ("Done Inserting")

End Sub

Notes:
Using Path.Combine when the second parameter is a complete path just returns the second parameter, so it's useless in this case.
Instead of converting a string to a char, you can write a char literal like this: "$"C.
Instead of breaking out of the loop when you are at the last item, just make the loop end one item earlier.
As you have nested loops you have to increase the counter in the loop instead of assigning the loop variable too it, otherwise you will only get the number of items in the last file. (If you are actually going to use the counter for anything.)

Guffa