Search code examples
vb.netopenfiledialog

Changing the Name of a File Selected in FileDialog


I am trying to make an application which takes a file from your computer, renames that file with variables from 4 different combo boxes and then uploads it to an FTP server.

I have gotten everything working except the renaming part.... what i am trying to do is this. slectedFile.pdf would become combobox1_combobox2_combobox3_combobox4.pdf The file path is stored in a variable named FileName i know how to update FileName with the combobox values, but does it keep the original Path?

How would i go about doing this?

This is the code i have so far. IP_box, User_Box and Pass_box are the textboxes for the appropriate server information.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Dim request As System.Net.FtpWebRequest = DirectCast(System.Net.WebRequest.Create(IP_Box.Text.ToString), System.Net.FtpWebRequest)
        request.Credentials = New System.Net.NetworkCredential(User_Box.Text.ToString, Pass_Box.Text.ToString)
        request.Method = System.Net.WebRequestMethods.Ftp.UploadFile

        Dim file() As Byte

        Try
            System.IO.File.ReadAllBytes(FileName)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
        End Try


        Dim strz As System.IO.Stream = request.GetRequestStream()
        strz.Write(file, 0, file.Length)
        strz.Close()
        strz.Dispose()
    End Sub

    Public Function OpenDialog()
        Dim FD As OpenFileDialog = New OpenFileDialog()

        FD.Title = "Selecteer een bestand"
        FD.InitialDirectory = "C:\"
        FD.Filter = "All files (*.*)|*.*|All files (*.*)|*.*"
        FD.FilterIndex = 2
        FD.RestoreDirectory = True

        If FD.ShowDialog() = DialogResult.OK Then
            Filename = System.IO.Path.GetFullPath(FD.FileName)
        End If
    End Function

Thank you in advance


Solution

  • At the end of your subroutine, you try to retrieve the file; you incorrectly use System.IO.Path.GetFullPath(FD.FileName) as FD.FileName already provides the full file name.

    In order to rename the file to your desired name, you need to firstly evaluate the values of each ComboBox, of which can be done as a loop:

    Private Function enumerateCheckboxes(ByVal path As String)
        Dim fName As String
        For Each Control In Me.Controls
            If (TypeOf Control Is CheckBox AndAlso DirectCast(Control, CheckBox).Checked) Then
                fName += CStr(Control.Name) + "_"
            End If
        Next
        fName = path + fName.Substring(0, fName.Length - 1) + ".pdf"
        Return fName
    End Function
    
    Public Function OpenDialog()
        Dim FD As OpenFileDialog = New OpenFileDialog()
    
        FD.Title = "Selecteer een bestand"
        FD.InitialDirectory = "C:\"
        FD.Filter = "All files (*.*)|*.*|All files (*.*)|*.*"
        FD.FilterIndex = 2
        FD.RestoreDirectory = True
    
        If FD.ShowDialog() = DialogResult.OK Then
            Dim Filename As String = FD.FileName
            Filename = StrReverse(Filename)
            Filename = Mid(Filename, InStr(Filename, "\"), Len(Filename))
            Filename = StrReverse(Filename)
            Return Filename
        End If
    End Function
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        OpenDialog()
    End Sub
    

    If I test with a file from the desktop:

    enter image description here

    However now we might possibly have an issue that the file does not exist, thus the program will crash. To fix this, we can quickly rename the file for the upload, and rename it back when it's finished.

    The complete code:

    Imports System.IO
    
    Public Class Form1
        Dim Filename As String
        Dim originalFile As String
    
        Public Function OpenDialog()
            Dim FD As OpenFileDialog = New OpenFileDialog()
    
            FD.Title = "Selecteer een bestand"
            FD.InitialDirectory = "C:\"
            FD.Filter = "All files (*.*)|*.*|All files (*.*)|*.*"
            FD.FilterIndex = 2
            FD.RestoreDirectory = True
    
            If FD.ShowDialog() = DialogResult.OK Then
                Filename = FD.FileName
                Filename = StrReverse(Filename)
                Filename = Mid(Filename, InStr(Filename, "\"), Len(Filename))
                Filename = StrReverse(Filename)
                Return Filename
            End If
        End Function
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim request As System.Net.FtpWebRequest = DirectCast(System.Net.WebRequest.Create(IP_Box.Text.ToString), System.Net.FtpWebRequest)
            request.Credentials = New System.Net.NetworkCredential(User_Box.Text.ToString, Pass_Box.Text.ToString)
            request.Method = System.Net.WebRequestMethods.Ftp.UploadFile
    
            Dim file() As Byte
    
            Try
                Filename = OpenDialog()
                System.IO.File.ReadAllBytes(Filename)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
            End Try
    
            FileSystem.Rename(originalFile, Filename)
            Dim strz As System.IO.Stream = request.GetRequestStream()
            strz.Write(file, 0, file.Length)
            strz.Close()
            strz.Dispose()
            FileSystem.Rename(Filename, originalFile)
        End Sub
    
        Private Function enumerateCheckboxes(ByVal path As String)
            originalFile = path
            Dim fName As String
            For Each Control In Me.Controls
                If (TypeOf Control Is CheckBox AndAlso DirectCast(Control, CheckBox).Checked) Then
                    fName += CStr(Control.Name) + "_"
                End If
            Next
            fName = path + fName.Substring(0, fName.Length - 1) + ".pdf"
            Return fName
        End Function
    End Class