如果文件不包含所提供的指定文件列表,如何从目录中删除文件?

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

我目前正在做一个项目,需要在特定目录中搜​​索文件。如果找到的文件不是批准的扩展名,则必须将文件移动到存档文件夹中。我需要允许用户删除和添加扩展程序,以便列表不是固定大小并且很可能每周更改。

到目前为止,我能够遍历目录并将其中的所有文件列出到列表框中。我的问题是在尝试区分已批准列表和当前列表时出现的,我无法缩小文件范围并将它们显示在列表框中。

我的错误是:“mscorlib.dll 中发生了类型为 'System.ArgumentOutOfRangeException' 的未处理异常”,其中我的 'list1' 变量计数为 0,因为即使匹配已批准也没有找到子项数据和当前数据。

堆栈溢出社区将不胜感激!谢谢!!

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[=10=]000000.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[=10=]000000.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

有几种方法可以解决这个问题,这种方法与您的方法相似。

' 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

我正在保存 FileInfo,因为(大概)您可能会在没有所有冗余路径信息的情况下向用户显示名称。但是 您的代码 将需要完整路径名以用于以后的 Copy/Move 操作。

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

代码当然可以简单地循环 AuthList 来完成它的工作。如果需要先将结果展示给用户,则无需制作2份。 DisplayMember 用于告诉 ListBox 要显示哪个 属性 值,同时保留列表中的所有其他信息。

最后,一个简单保存完整文件名的linq版本:

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