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

Posted

技术标签:

【中文标题】如何重命名列表框中所有文件的后缀?【英文标题】:How to rename suffix of all files in listbox? 【发布时间】:2021-07-24 07:48:32 【问题描述】:

我有一个包含两个列表框和两个工具条标签(按钮)的窗体。

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

apple_001.jpg > apple_Ambrosia.jpg apple_002.jpg > apple_Melba.jpg apple_003.jpg > apple_Granny.jpg

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

到目前为止,我已经让加载 listbox1 (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

说到保存名字部分,我完全不知道。

也感谢您抽出宝贵的时间。

【问题讨论】:

新名称从何而来?它们是存储在某个地方还是您当时手动输入它们? 新名称总是一样的,所以我想对它们进行硬编码,我一共得到了 12 张图像,它们总是以 001,002,003 等开头。这些总是会更改为同一个词。所以... 001 将永远成为 Ambrosia 002 将永远成为 Melba 等等。 【参考方案1】:

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

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

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

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

要实际更改磁盘上的文件名,我们可以使用 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 方法来完成这项工作。https://docs.microsoft.com/en-us/dotnet/api/system.string.replace?view=净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

【讨论】:

嗨,玛丽,谢谢你,它工作得很好,我现在已经将它拆分为多个按钮,它正在做它应该做的工作。我确实得到了一个错误,在将“ListFilesLoaded.Items.Clear()”添加到打开文件按钮之后(这样我就可以清除所有打开的文件并基本上选择一组新的文件来重命名),当按钮是应用程序错误按下(“设置 DataSource 属性时无法修改项目集合。”)。我在“If”语句之前添加了这行代码来打开文件。 @Oogle_doogleson 我认为您需要设置ListFilesLoaded.DataSource = Nothing 要清除List(Of T),请使用.Clear 方法。

以上是关于如何重命名列表框中所有文件的后缀?的主要内容,如果未能解决你的问题,请参考以下文章

python批量重命名指定目录下所有文件的后缀名

重命名列表数据框中元素的最有效方法

怎么给手机照片重命名

批量重命名文件

python 批量重命名文件后缀

DOS按规则批量重命名所有(子)目录下文件