此代码用于从系统中删除系统中的实际文件:
Dim file As String()
file = System.IO.Directory.GetFiles("C:\Users\User\Desktop", "lalala.txt", IO.SearchOption.AllDirectories)
If ListBox1.SelectedIndex = -1 Then
MsgBox("No files selected")
Else
System.IO.File.Delete(ListBox1.Items(ListBox1.SelectedIndex).ToString())
ListBox1.Items.RemoveAt(ListBox1.SelectedIndex)
End If
但是,只会删除列表框中的项目。实际文件仍然存在。我不确定在哪里将file
放入删除功能。
我提到this,但它没有帮助我。
________ UPDATE ________
我发现它出错了:这是因为只有文件名被添加到列表框中:
ListBox1.Items.Add(Path.GetFileName(fileFound))
而不是Path.GetFullPath
。
无论如何,我可以仅使用GetFileName
删除文件吗?
答案 0 :(得分:2)
问题,正如您所意识到的那样,文件名仅仅是删除文件的信息不足。您还需要文件的完整路径。所以你需要一些存储整个路径但只显示文件名的方法。这也很重要,因为在不同的目录中可能有两个(或更多)具有相同名称的文件。
ListBox可以将其Datasource
属性设置为显示来自“实现IList或IListSource接口的对象的项目,例如DataSet或Array。”
然后设置DisplayMember
和ValueMember
属性,告诉它显示什么以及提供什么值。
例如,我编写了一个名为“FileItem”的类,它具有完整文件名的属性,无论你想要显示什么属性,都填充了一个带有“FileItem”实例的列表,并告诉ListBox1显示它: / p>
Imports System.IO
Public Class Form1
Class FileItem
Property FullName As String
Property DisplayedName As String
Public Sub New(filename As String)
Me.FullName = filename
Me.DisplayedName = Path.GetFileNameWithoutExtension(filename)
End Sub
End Class
Private Sub PopulateDeletionList(dir As String, filter As String)
Dim files = Directory.EnumerateFiles(dir, filter, SearchOption.AllDirectories)
Dim fileNames = files.Select(Function(s) New FileItem(s)).ToList()
Dim bs As New BindingSource With {.DataSource = fileNames}
ListBox1.DataSource = bs
ListBox1.DisplayMember = "DisplayedName"
ListBox1.ValueMember = "FullName"
End Sub
Private Sub ListBox1_Click(sender As Object, e As EventArgs) Handles ListBox1.Click
Dim lb = DirectCast(sender, ListBox)
Dim sel = lb.SelectedIndex
If sel >= 0 Then
Dim fileToDelete = CStr(lb.SelectedValue)
Dim choice = MessageBox.Show("Do you really want to delete " & fileToDelete, "Confirm file delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If choice = DialogResult.Yes Then
Try
File.Delete(fileToDelete)
lb.DataSource.RemoveAt(sel)
Catch ex As Exception
MessageBox.Show("Could not delete " & fileToDelete & " because " & ex.Message)
End Try
End If
End If
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
PopulateDeletionList("C:\temp", "*.txt")
End Sub
End Class
已编辑我忘了从ListBox中删除该项目。为此,需要通过BindingSource将其绑定到DataSource。
额外功能看到可能有多个具有相同名称的文件,您可能需要向列表框项添加工具提示,以便您可以查看它所在的目录。请参阅{ {3}}对于只需要对工作进行微小调整的实现,例如:
Dim toolTip As ToolTip = New ToolTip()
' ...
Private Sub ListBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles ListBox1.MouseMove
Dim lb = DirectCast(sender, ListBox)
Dim index As Integer = lb.IndexFromPoint(e.Location)
If (index >= 0 AndAlso index < ListBox1.Items.Count) Then
Dim desiredTooltip = DirectCast(lb.Items(index), FileItem).FullName
If (toolTip.GetToolTip(lb) <> desiredTooltip) Then
toolTip.SetToolTip(lb, desiredTooltip)
End If
End If
End Sub
答案 1 :(得分:1)
您可以使用Path.Combine。
由于您要在 C:\ Users \ User \ Desktop 中进行搜索,您可以执行此操作以删除:
System.IO.File.Delete(Path.COmbine("C:\Users\User\Desktop",ListBox1.Items(ListBox1.SelectedIndex).ToString())
此处,"C:\Users\User\Desktop"
和所选索引的文本将合并为一条路径。
<小时/> 编辑:
嗯,你可以这样做:
放入两个列表框,在将文件添加到listbox1时,将其路径放到listbox2,其可见性为False,这意味着它不会显示在运行时中。
执行此操作时,在listbox1中选择一个项目时,使用path.combine通过添加文件名&amp;来创建路径。具有相同索引号的列表中的路径。
这样的事情:
System.IO.File.Delete(path.combine(ListBox1.Items(ListBox1.SelectedIndex).ToString(), ListBox2.Items(ListBox1.SelectedIndex).ToString())
答案 2 :(得分:1)
最简单(可靠)的解决方案是创建自定义数据类型,然后将其添加到ListBox
。
通过覆盖ToString()
方法,您可以使其仅显示文件名,而后端对象仍包含完整路径。
Public Structure FileEntry
Public FullPath As String 'A variable holding the full path to the file.
'Overriding the ToString() method, making it only return the file name.
Public Overrides Function ToString() As String
Return System.IO.Path.GetFileName(Me.FullPath)
End Function
Public Sub New(ByVal Path As String)
Me.FullPath = Path
End Sub
End Structure
现在,只要您想向ListBox
添加路径,就必须添加FileEntry
结构的新实例,而不是常规字符串:
ListBox1.Items.Add(New FileEntry(fileFound))
要删除您,只需将当前选定的项目投放到FileEntry
,然后将其FullPath
传递到File.Delete()
方法。
Dim Entry As FileEntry = DirectCast(ListBox1.Items(ListBox1.SelectedIndex), FileEntry)
System.IO.File.Delete(Entry.FullPath)
注意:为此, 列表框中的每个 项必须为FileEntry
。
在线测试: https://dotnetfiddle.net/x2FuV3(原谅格式化,DotNetFiddle在手机上效果不佳)
<强>文档强>