如何重命名列表框中所有文件的后缀?

How to rename suffix of all files in listbox?

我有一个 windows 表单,其中包含两个列表框和两个工具条标签(按钮)。

按下第一个按钮(打开文件夹),文件浏览器打开,您可以 select 多个文件,然后将这些文件加载​​到列表框 1 (ListFilesLoaded),现在我要做的是显示转换列表框 2 (ConvertedNames) 中的文件名。例如...

然后按我的第二个按钮(重命名文件)将重命名的文件保存在它们的原始目录中(删除旧文件/名称)。

到目前为止,我的加载列表框 1 (ListFilesLoaded) 工作正常。我只是不确定如何更改列表框 2 (ConvertedNames) 中的显示名称并将它们保存为新文件名。

Imports System.IO
Public Class Form1
Private openFile As OpenFileDialog 'window to open files

Private Sub ToolStripLabel1_Click(sender As Object, e As EventArgs) Handles ToolStripLabel1.Click
    Try
        openFile = New OpenFileDialog
        openFile.Title = "Select files."
        openFile.CheckFileExists = True
        openFile.Multiselect = True
        openFile.RestoreDirectory = False

        If openFile.ShowDialog = Windows.Forms.DialogResult.OK Then
            openFile.SafeFileNames.Count()
            For i As Integer = 0 To openFile.SafeFileNames.Count() - 1
                ListFilesLoaded.Items.Add(openFile.SafeFileNames(i))
                ConvertedNames.Items.Add(openFile.SafeFileNames(i))
            Next

        End If
    Catch ex As Exception
        MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

    End Try


End Sub

Private Sub ToolStripLabel2_Click(sender As Object, e As EventArgs) Handles ToolStripLabel2.Click

End Sub

所以基本上我认为我需要类似...

If ConvertedNames.Items.string.contains "_001" then
   ConvertedNames.Items.string = ConvertedNames.Items.string -4 + _Ambrosia
else if
   ConvertedNames.Items.string.contains "_002" then
   ConvertedNames.Items.string = ConvertedNames.Items.string -4 + _Melba
else if
   ConvertedNames.loaded.name.contains "_003" then
   ConvertedNames.Items.string = ConvertedNames.Items.string -4 + _Granny
End If

关于保存名字的部分,我完全没有概念。

感谢您抽出时间来看看。

我更改了您的控件名称以匹配我的测试程序。

我用了一个List(Of Tuple(Of String, String)来存放原始文件的路径和文件名。 https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/data-types/tuples and https://docs.microsoft.com/en-us/dotnet/api/system.tuple?view=net-5.0 如果没有命名项,元组元素被称为第一个字符串的 Item1 和第二个字符串的 Item2。由于我们的方法很小,我觉得命名元素或使用结构或 class 是没有必要的。

Item1 is the full path (with file name and extension)
Item2 is the file name only with extension

接下来,我们将列表绑定到设置显示和值成员的第一个列表框。现在我们可以遍历列表框。请记住,列表框中的每个项目都是一个 Tuple(Of String, String),我们可以使用 Item1Item2 来引用其元素。我们将文件名发送到 returns 新文件名

的函数

要实际更改磁盘上的文件名,我们可以使用 Visual Basic 特定的 FileIO.FileSystem.Rename 方法。 https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.fileio.filesystem.renamefile?view=net-5.0该方法以原文件的完整路径和新文件名作为参数。

最后,新名称添加到第二个列表框中。

GetNewName 函数使用 Select CaseString.Replace 方法来执行 job.https://docs.microsoft.com/en-us/dotnet/api/system。 string.replace?view=net-5.0

Private Sub ToolStripLabel1_Click(sender As Object, e As EventArgs) Handles ToolStripLabel1.Click
    Dim openFile = New OpenFileDialog
    openFile.Title = "Select files."
    openFile.CheckFileExists = True
    openFile.Multiselect = True
    openFile.RestoreDirectory = False

    If openFile.ShowDialog = Windows.Forms.DialogResult.OK Then
        Dim lstPathAndFile As New List(Of Tuple(Of String, String))
        For Each filePath In openFile.FileNames
            lstPathAndFile.Add(Tuple.Create(filePath, Path.GetFileName(filePath)))
        Next
        ListBox1.DisplayMember = "Item2"
        ListBox1.ValueMember = "Item1"
        ListBox1.DataSource = lstPathAndFile
        For Each t As Tuple(Of String, String) In ListBox1.Items
            Dim NewName = GetNewName(t.Item2)
            FileIO.FileSystem.RenameFile(t.Item1, NewName)
            ListBox2.Items.Add(NewName)
        Next
    End If
End Sub

Private Function GetNewName(OriginalFileName As String) As String
    Dim NewFileName As String = ""
    Select Case True
        Case OriginalFileName.Contains("001")
            NewFileName = OriginalFileName.Replace("001", "Ambrosia")
        Case OriginalFileName.Contains("002")
            NewFileName = OriginalFileName.Replace("002", "Melba")
        Case OriginalFileName.Contains("003")
            NewFileName = OriginalFileName.Replace("003", "Granny")
    End Select
    Return NewFileName
End Function