Solved

List files and folders vb.net

Posted on 2007-03-28
6
36,219 Views
Last Modified: 2009-10-03
Hi All,

I need to specify a folder and loop through all the subfolders and files in those and list them.

I am using vb/net (2005).

0
Comment
Question by:nzfire
6 Comments
 
LVL 39

Expert Comment

by:appari
ID: 18813669
try this

Dim files() As String

        files = System.IO.Directory.GetFiles("c:\work\", "*.*", IO.SearchOption.AllDirectories)
        For Each fname As String In files
            Console.WriteLine(fname)
        Next
0
 

Expert Comment

by:srpraju
ID: 18813945
i am writing the code for reading folders , subfolders and subfiles of a given folder and i am writing all those folders,subfolders list in a text file. try this


Imports System.IO
Public Class Form1
    Dim dirpath As String
    Function GetFolderSize(ByVal dPath As String, ByVal includeSubFolders As Boolean) As Long
        Dim files() As String
        files = System.IO.Directory.GetFiles("f:\gopi", "*.*", IO.SearchOption.AllDirectories)
        Dim objAssembly As Reflection.Assembly = Reflection.Assembly.GetAssembly(Me.GetType)
        Dim strAppPath As String = objAssembly.CodeBase
        strAppPath = strAppPath.Replace("WindowsApplication3.dll", "")
        Dim objUri As Uri = New Uri(strAppPath)
        strAppPath = Application.StartupPath 'objUri.AbsolutePath
        Dim strBatchFilePath As String = strAppPath + "\folders.txt"
        Dim sw As StreamWriter = Nothing
        sw = File.CreateText(strBatchFilePath)
        Dim ReadString As String = "@echo off"
        sw.WriteLine(ReadString)
        For Each fname As String In files
            ' Console.WriteLine(fname)
            sw.WriteLine(fname)
        Next
    End Function
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        GetFolderSize("f:\gopi", True)
    End Sub
End Class

if you want to show these folders, sub folders in a treeview let me know....
0
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 18815875
Hi nzfire;

Here is a solution using the new worker thread in .Net 2005. If you do not want to use a new thread then the code in BgWorker_DoWork and SearchFiles is the code to do what you want.

This code sample assumes that the form has the following controls on it:
TextBox called txtSearchPath
TextBox called txtSearchPattern
Label   called lblMessage
Button  called btnStart
ListBox called lstFiles


Imports System.IO

Public Class SearchFilesFrm

    ' To set up for a background operation, add an event handler for the DoWork event.
    ' Call your time-consuming operation in this event handler. To start the operation,
    ' call RunWorkerAsync. To receive notifications of progress updates, handle the
    ' ProgressChanged event. To receive a notification when the operation is completed,
    ' handle the RunWorkerCompleted event.
    ' Note  
    ' You must be careful not to manipulate any user-interface objects in your DoWork
    ' event handler. Instead, communicate to the user interface through the
    ' ProgressChanged and RunWorkerCompleted events.
    ' If your background operation requires a parameter, call RunWorkerAsync with your
    ' parameter. Inside the DoWork event handler, you can extract the parameter from
    ' the DoWorkEventArgs.Argument property.

    ' Store the results of the search
    Private Files As List(Of String)
    ' Used to prevent nested calls to ProgressChanged
    Private CallInProgress As Boolean
    ' The Worker thread
    Private WithEvents BgWorker As New System.ComponentModel.BackgroundWorker

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

        ' Enable ProgressChanged and Cancellation mothed
        BgWorker.WorkerReportsProgress = True
        BgWorker.WorkerSupportsCancellation = True

    End Sub

    ' Start and Stop the search
    Private Sub btnStart_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles btnStart.Click

        If btnStart.Text = "Start" Then
            If Not Directory.Exists(txtSearchPath.Text.Trim()) Then
                MessageBox.Show("The Search Directory does not exist", _
                    "Path Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Return
            End If
            If txtSearchPattern.Text.Trim() = "" Then txtSearchPattern.Text = "*"
            Dim arguments() As String = {txtSearchPath.Text.Trim(), _
                txtSearchPattern.Text.Trim()}

            lstFiles.Items.Clear()
            ' Start the background worker thread. Thread runs in DoWork event.
            BgWorker.RunWorkerAsync(arguments)
            btnStart.Text = "Stop"
        Else
            BgWorker.CancelAsync()
        End If

    End Sub

    ' Start the Asynchronous file search. The background thread does it work from
    ' this event.
    Private Sub BgWorker_DoWork(ByVal sender As Object, _
        ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BgWorker.DoWork

        'Retrieve the search path which was requested
        Dim path As String = DirectCast(e.Argument, String())(0)
        Dim pattern As String = DirectCast(e.Argument, String())(1)

        ' Invoke the worker procedure
        Files = New List(Of String)
        SearchFiles(path, pattern)
        ' Return a result to the RunWorkerCompleted event
        Dim message As String = String.Format("Found {0} Files", Files.Count)
        e.Result = message

    End Sub

    ' Recursively search directory and sub directories
    Private Sub SearchFiles(ByVal path As String, ByVal pattern As String)

        ' Displat message
        Dim message As String = String.Format("Parsing Directory {0}", path)
        BgWorker.ReportProgress(0, message)

        'Read the files and if the Stop button is pressed cancel the operation
        For Each fileName As String In Directory.GetFiles(path, pattern)
            If BgWorker.CancellationPending Then Return
            Files.Add(fileName)
        Next
        For Each dirName As String In Directory.GetDirectories(path)
            If BgWorker.CancellationPending Then Return
            SearchFiles(dirName, pattern)
        Next

    End Sub

    ' The bacground thread calls this event when you make a call to ReportProgress
    ' It is OK to access user controls in the UI from this event.
    ' If you use a Progress Bar or some other control to report the tasks progress
    ' you should avoid unnecessary calls to ReportProgress method because this causes
    ' a thread switch which is a relatively expensive in terms of processing time.
    Private Sub BgWorker_ProgressChanged(ByVal sender As Object, _
        ByVal e As System.ComponentModel.ProgressChangedEventArgs) _
        Handles BgWorker.ProgressChanged

        ' Reject a nested call.
        If CallInProgress Then Return
        CallInProgress = True
        ' Display the message received in the UserState property
        lblMessage.Text = e.UserState.ToString()
        ' Display all files added since last call.
        For idx As Integer = lstFiles.Items.Count To Files.Count - 1
            lstFiles.Items.Add(Files(idx))
        Next
        ' If a Me.Refresh is in this code you will need to place a Application.DoEvents()
        ' otherwise the UI will not respond without them it works fine.
        ' Me.Refresh()
        ' Let the Windows OS process messages in the queue
        ' Application.DoEvents()
        CallInProgress = False

    End Sub

    ' The background thread calls this event just before it reaches the End Sub
    ' of the DoWork event. It is OK to access user controls in the UI from this event.
    Private Sub BgWorker_RunWorkerCompleted(ByVal sender As Object, _
        ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _
        Handles BgWorker.RunWorkerCompleted

        ' Display the last message and reset the Start/Stop button text
        lblMessage.Text = e.Result.ToString()
        btnStart.Text = "Start"

    End Sub

End Class


Fernando
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 17

Accepted Solution

by:
ZeonFlash earned 500 total points
ID: 18815896
Here's a link to a recursive solution for displaying the names of all folders (and sub-folders...and sub-folders of those...etc).  Going about it recursively will allow you to specify a beginning folder and list everything from that point down.  You can use a simple little For loop on the GetFiles collection of the current directory to list the files.

http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_22039766.html
0
 
LVL 1

Author Comment

by:nzfire
ID: 18839472
Great, thanks.

That was the simplest bit of code, and it works just fine.

Thanks to the others that posted code...
0
 
LVL 67

Expert Comment

by:sirbounty
ID: 21184415
Great code Fernando.  I'd like to utilize a similar logic for something I'm trying out...if you're interested, my new question is at http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_23260962.html
Thanx!
0

Featured Post

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
ASP.NET (VB) return a record 2 52
VS 2015 is giving [No relevant source lines] 2 39
Visual Studio hangs on running project 6 60
Access/Visual Basic Question 3 42
It’s quite interesting for me as I worked with Excel using vb.net for some time. Here are some topics which I know want to share with others whom this might help. First of all if you are working with Excel then you need to Download the Following …
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
With Secure Portal Encryption, the recipient is sent a link to their email address directing them to the email laundry delivery page. From there, the recipient will be required to enter a user name and password to enter the page. Once the recipient …
In an interesting question (https://www.experts-exchange.com/questions/29008360/) here at Experts Exchange, a member asked how to split a single image into multiple images. The primary usage for this is to place many photographs on a flatbed scanner…

749 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question