.NET从列表框中删除实际文件

时间:2017-09-30 13:29:58

标签: vb.net listbox delete-file

此代码用于从系统中删除系统中的实际文件:

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删除文件吗?

3 个答案:

答案 0 :(得分:2)

问题,正如您所意识到的那样,文件名仅仅是删除文件的信息不足。您还需要文件的完整路径。所以你需要一些存储整个路径但只显示文件名的方法。这也很重要,因为在不同的目录中可能有两个(或更多)具有相同名称的文件。

ListBox可以将其Datasource属性设置为显示来自“实现IList或IListSource接口的对象的项目,例如DataSet或Array。”

然后设置DisplayMemberValueMember属性,告诉它显示什么以及提供什么值。

例如,我编写了一个名为“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在手机上效果不佳)

<强>文档