Pez
Pez

Reputation: 25

How to remove files from a directory if they don't contain the list of specified files provided?

I'm currently doing a project where I need to search through a specific directory for files. If the files found are not the approved extension then the files must be moved to an archive folder. I need to user to be allowed to remove and add extensions so the list is not a set size and will most likely change weekly.

So far I'm able to loop through the directories and list all the files in there into a listbox. My problem comes when trying to differentiate between the approved list and the current list and I can't narrow down the files and display them in the list box.

My error is : 'An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in mscorlib.dll' where my 'list1' variable count is 0 because no children were found even when there are matching approved data and current data.

Any help would be appreciate from stack overflow community! Thanks!!

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim list1 As List(Of String)
    list1 = (From item As String In Me.ListBox1.Items Select item Where Me.ListBox1.Items.Contains(Me.lstApprovedItems.Items)).ToList()

    ListBox1.Items.Add(list1(0))

End Sub

Dim fri As FileInfo

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

    Dim FileName1 As String = ""        

    Dim dir2 As New DirectoryInfo("D:\Administrator\Desktop\File Management System v0.2\File Management System\File Directories\File Directories\00000000.00F")   
    Dim dir1 As DirectoryInfo() = dir2.GetDirectories()

    Dim fri2 As DirectoryInfo
    For Each fri2 In dir1

        FileName1 = Convert.ToString(fri2.Name)     

        Dim dir As New DirectoryInfo("D:\Administrator\Desktop\File Management System v0.2\File Management System\File Directories\File Directories\00000000.00F\" + FileName1) 
        Dim fiArr As FileInfo() = dir.GetFiles()     

        For Each Me.fri In fiArr

            ListBox1.Items.Add(fri.Name)

        Next fri
    Next
End Sub
End Class

Upvotes: 1

Views: 359

Answers (1)

There are several ways to go about this, this way is similar to what you have.

' first get OK extension into an array (or list)
Dim Auth(lbAuthExt.Items.Count - 1) As String
lbAuthExt.Items.CopyTo(Auth, 0)

' storage for the result
' only save the Authorized ones if that is all you care about
Dim AuthList As New List(Of FileInfo)
Dim NoAuthList As New List(Of FileInfo)

Dim dir = New DirectoryInfo("C:\Temp")
For Each fi As FileInfo In dir.GetFiles

    If Auth.Contains(fi.Extension) Then
        AuthList.Add(fi)
    Else
        NoAuthList.Add(fi)
    End If
Next

I am saving FileInfo because (presumably) you might display the names to the user without all the redundant path info. But your code will need the full path name for later Copy/Move ops.

' set the list as the datasource
lbResult.DataSource = AuthList
' display file name
lbResult.DisplayMember = "Name"
' return full name to code
lbResult.ValueMember = "FullName"

The code can of course simply loop on AuthList to do its job. If you need to show the results to the user first, there is no need to make 2 copies. DisplayMember is used to tell the ListBox which property value to display while retaining all the other info in the list.

Finally, a linq version which simply saves the full file name:

Dim myAuthList = (From func In Directory.EnumerateFiles("C:\Temp", "*.*", 
            System.IO.SearchOption.AllDirectories)
            Where Auth.Contains(Path.GetExtension(func), 
                StringComparer.InvariantCultureIgnoreCase)).ToList

Upvotes: 1

Related Questions