如果文件不包含所提供的指定文件列表,如何从目录中删除文件?
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
我目前正在做一个项目,需要在特定目录中搜索文件。如果找到的文件不是批准的扩展名,则必须将文件移动到存档文件夹中。我需要允许用户删除和添加扩展程序,以便列表不是固定大小并且很可能每周更改。
到目前为止,我能够遍历目录并将其中的所有文件列出到列表框中。我的问题是在尝试区分已批准列表和当前列表时出现的,我无法缩小文件范围并将它们显示在列表框中。
我的错误是:“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