Переименование файла, если файл уже существует более одного раза - PullRequest
1 голос
/ 30 мая 2020

У меня есть рабочий код, который возьмет файл, например, «photo.png», и переместит его в папку. Если он уже существует, он переименует его в «1_photo.png», хотя, если у вас есть другое имя фотографии «photo.png», он переименует его в файл «1_photo.png», который уже закрывается и не будет работать. Я хотел бы знать, какое решение для этого есть.

        Dim grade As String
        grade = (FolderBrowserDialog1.SelectedPath)
        grade = My.Settings.SD

        My.Computer.FileSystem.CreateDirectory(
grade + ("\Pictures"))

        Dim filePaths = IO.Directory.GetFiles(grade, "*.png")

        For Each filePath In filePaths
            Dim filename = IO.Path.GetFileName(filePath)
            Dim newPath = IO.Path.Combine(grade + ("\Pictures"), filename)

            If IO.File.Exists(newPath) Then
                Dim dr = MessageBox.Show($"File {newPath} exists, do you want to keep both files? The recently moved file will have a number added to its name", "", MessageBoxButtons.YesNoCancel)

                Select Case dr
                    Case DialogResult.Cancel
                        Continue For

                    Case DialogResult.No
                        IO.File.Delete(newPath)

                    Case DialogResult.Yes


                        If IO.File.Exists(newPath) Then
                            Dim rn As New Random
                            My.Computer.FileSystem.RenameFile(newPath, "1_" + filename)

                            IO.File.Move(filePath, newPath)

                            MessageBox.Show("Pictures Compiled and Cleaned")

                            Return
                        End If


                End Select

            End If

            IO.File.Move(filePath, newPath)

1 Ответ

0 голосов
/ 30 мая 2020

Вы делаете al oop условным для существующего файла:

Dim filename = "a.png"
Dim dirname = "c:\temp"

Dim filePath = Path.Combine(dirname, filename)

Dim i as Integer = 1
While(IO.File.Exists(filePath))
  filePath = Path.Combine(dirname, i & "_" & filename)
  i += 1
End While

В конце концов l oop найдет путь к файлу, который не существует.

Ввод числа в начале имени файла, кстати, вероятно, плохая идея. Я рекомендую вам поместить его в конец:

filePath = Path.Combine(dirname, Path.ChangeExtension(filename, i & Path.GetExtension(filename)))

Это делает файлы типа photo.png, photo.1.png, photo.2.png, photo.3.png ...

Я бы заключил это в функцию, которая находит имя файла, которое не соответствует классу sh:

Function GetRelatedNonExistantFilepath(Dim desiredPath as String) As String()

    Dim filename =  Path.GetFilenameWithoutExtension(desiredPath)
    Dim ext = Path.GetExtension(desiredPath)
    Dim dirname = Path.GetDirectoryName(desiredPath)

    Dim filePath = desiredPath

    Dim i as Integer = 1
    While(IO.File.Exists(filePath))
      filePath = Path.Combine(dirname, filename & "_" & i & ext)
      i += 1
    End While

    Return filePath
End Function

Следовательно, вы бы использовали его как:

    'want to move to c:\temp\photo.png but it might exist
    Dim dest = "c:\temp\photo.png"

    Dim actualDest = GetRelatedNonExistantFilepath(dest)

    'move file to actual dest
    IO.FIle.Move(sourcePath, actualDest)
...