OpenFileDialog - Datei Kopieren, umbennen und Umbenannte Datei öffnen

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Eiskaffee.

    OpenFileDialog - Datei Kopieren, umbennen und Umbenannte Datei öffnen

    Hi!

    Ich habe folgendes vor:

    Wenn ich auf einen Button drücke, öffnet sich mein Filedialog.
    Ich such mir eine Datei aus, drücke auf OK, folgendes soll passieren:

    Die Datei wird kopiert / gleichzeitig umbenannt bzw. Ein text noch dazugefügt - ich würde gerne eine Combobox einbauen bei der ich dann aus 4 Optionen auswählen kann. (Im Code allerdings noch nicht vorhanden)
    Datei würde dann kopiert so aussehen: <Dateiname> + "-" + <Inhalt-Combobox> + <Dateiendung>

    Dann soll es mir die KOPIERTE datei öffnen.
    Folgenden Code habe ich, der allerdings nur insoweit funktioniert, dass er mir die kopierte datei in das verzeichnis meines Visual Basic projekts ablegt!? wo hab ich das denn bitte im Code angegeben :D

    VB.NET-Quellcode

    1. Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click
    2. OpenFileDialog1.InitialDirectory = "N:\" + TextBox1.Text 'Habe eine Combobox mit der ich halt aus ca 50 unterordndern mein Inititial Directory aussuche
    3. If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
    4. File.Copy(OpenFileDialog1.FileName, Path.GetFileNameWithoutExtension(OpenFileDialog1.FileName) & "Kopie.psd")
    5. End If
    6. End Sub


    Ich habe versucht die Endung "psd" mit einem allgemein gültigen code zu formulieren, so dass es mir einfach die endung hinmacht welche die Originaldatei hatte, aber das hat irgendwie nicht funktioniert.

    Insofern ist im Code noch nicht enthalten, dass auf den Kopiervorgang die Datei geöffnet wird.. weil es mir ja noch nichteinmal die Datei so kopiert wie ich will.

    Ich danke euch schonmal!

    Edit:
    Für alle die das Problem haben, hier die Lösung
    :


    VB.NET-Quellcode

    1. Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click
    2. Using ofd As New OpenFileDialog()
    3. ofd.InitialDirectory = "N:\" + TextBox1.Text
    4. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
    5. TextBox5.Text = System.IO.Path.GetFileNameWithoutExtension(ofd.FileName)
    6. TextBox5.Text = TextBox5.Text.Split(CChar(" -"))(0)
    7. Dim fi As New IO.FileInfo(ofd.FileName)
    8. fi.CopyTo(fi.DirectoryName & "\" _
    9. & TextBox5.Text & " - " & ComboBox1.Text & fi.Extension)
    10. Process.Start(fi.DirectoryName & "\" _
    11. & TextBox5.Text & " - " & ComboBox1.Text & fi.Extension)
    12. End If
    13. End Using
    14. End Sub


    Das Textbox5.Text zeug dient mir zur Umbenennung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eiskaffee“ ()

    Wilkommen erstmal :)
    Versuche DirectoryInfo und FileInfo zu nutzen, weil das einfach übersichtlicher bzw. schöner ist.
    Hier mal ein Beispiel aus einem anderen Anwendungsfall.

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class File
    3. Private ll As New List(Of IO.FileInfo)
    4. Dim di As IO.DirectoryInfo()
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. ll.Clear()
    7. Using fbd As New FolderBrowserDialog
    8. If fbd.ShowDialog = Windows.Forms.DialogResult.OK Then
    9. For Each fi In New IO.DirectoryInfo(fbd.SelectedPath).GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    10. ll.Add(New IO.FileInfo(fi.Name))
    11. Next
    12. Me.ListBox1.DataSource = ll
    13. End If
    14. End Using
    15. End Sub
    16. End Class
    Hmm ja probier ich gleichmal... aber zu dem Strict on ....

    also wenn ich das reinmache kriege ich in 2 fällen im prinzip den selben Fehler:


    Fehler 1 "Option Strict On" lässt keine impliziten Konvertierungen von System.Windows.Forms.DialogResult in String zu. C:\Users\FSPhoto\Documents\Visual Studio 2010\Projects\WindowsApplication1\WindowsApplication1\Form1.vb 190 126 WindowsApplication1


    edit: Grade versucht, aber keine Chance, ich benutze ja nicht ansatzweise das zeug was in dem Code steht?

    Habe kein FolderBrowser, keine Listbox, nicht mehrere Dateien die geöffnet werden sollen...

    edit2: Grade auch gefunden wo der Fehler ist dass die Datei im Projektverzeichnis ist.

    VB.NET-Quellcode

    1. File.Copy(OpenFileDialog1.FileName, Path.GetFileNameWithoutExtension(OpenFileDialog1.FileName) & "Kopie.psd")


    Irgendwo da muss ich ja noch den Ordner reinschreiben wo des hinkopiert wird, aber wie sag ich dem dass er das in das selbe Verzeichnis reinkopiert in dem ich die Originaldatei aufgerufen bzw. kopiert habe ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eiskaffee“ ()

    Du dimensionierst etwas nicht oder falsch.

    Ein Minibeispiel:

    VB.NET-Quellcode

    1. Dim Result As DialogResult
    2. Result = MessageBox.Show(Message, Caption, Buttons, MessageBoxIcon.Exclamation)
    3. If Result = System.Windows.Forms.DialogResult.Cancel Then
    4. Exit Sub
    5. End If


    HaRo
    @ Haro:

    im konkreten Fall ist hier der Fehler:

    VB.NET-Quellcode

    1. Private Sub Button9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button9.Click
    2. SaveFileDialog1.InitialDirectory = "N:\" + Textbox3.Text
    3. If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
    4. If File.Exists("S:\Allgemein_Software\Adobe_Photoshop_CS2_Beweissicherung\Source\Grundriss Blatt Digitale Vorlage.psd") Then
    5. File.Copy("S:\Allgemein_Software\Adobe_Photoshop_CS2_Beweissicherung\Source\Grundriss Blatt Digitale Vorlage.psd", SaveFileDialog1.ShowDialog)
    6. Else
    7. MsgBox("Die zu kopierende Datei existiert nicht!")
    8. End If
    9. End If
    10. End Sub


    In Zeile 5 wird "SaveFileDialog1" unterkringelt mit der Meldung: "Option Strict On" lässt keine impliziten Konvertierungen von System.Windows.Forms.DialogResult in String zu.

    bin neu in dem ganzen und find mich grad garnicht zurecht :D
    @Eiskaffee
    Guck dir das mal an:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class File
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Using ofd As New OpenFileDialog()
    5. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
    6. Dim fi As New IO.FileInfo(ofd.FileName)
    7. fi.CopyTo(fi.DirectoryName & "\name" & fi.Extension)
    8. End If
    9. End Using
    10. End Sub
    11. End Class

    Eiskaffee schrieb:

    SaveFileDialog1
    ist offenbar nicht oder falsch dimensioniert. Ausserdem bekomme ich Kopfschmerzen bei Deiner "FileCopy" Zeile.
    LaMiy hat da schon ein gutes Beispiel, was auch Deine Frage nach der Extension beantwortet. Allerdings solltest Du den Pfad- und Dateinamen lieber mit "System.IO.Path.Combine" zusammensetzen.

    HaRo
    @Eiskaffee
    So: (statt "deinText" das selectierte Item in der ComboBox)
    Achja und verwende besser IO.Path.Combine(), dann musst du die Backslashes nicht machen.

    VB.NET-Quellcode

    1. Using ofd As New OpenFileDialog()
    2. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
    3. Dim fi As New IO.FileInfo(ofd.FileName)
    4. fi.CopyTo(fi.DirectoryName & "\" _
    5. & IO.Path.GetFileNameWithoutExtension(fi.Name) & "deinText" & fi.Extension)
    6. End If
    7. End Using
    Okay vielen Dank, das mit dem Kopieren funktioniert jetzt Einwandfrei :)

    Gut, dann mach ich mich da mal ran HaRo, aber wie mach ich denn das mit dem SaveFileDialog?

    Im moment schaut er ja ob die Datei (liegt auf unserem Server, also das Verzeichnis ist eig. in Ordnung) vorhanden ist, wenn ja kopiert er sie in das Verzeichnis das ausgewählt wurde und öffnet die kopierte dann...

    Wie soll ich das denn anders machen?

    Edit: Okay hab jetzt den Savefiledialog umgeschrieben:

    VB.NET-Quellcode

    1. Using sfd As New SaveFileDialog()
    2. sfd.InitialDirectory = "N:\" + TextBox1.Text
    3. sfd.Filter = "Photoshop (*.psd)|*.psd"
    4. sfd.FilterIndex = 1
    5. sfd.RestoreDirectory = True
    6. sfd.FileName = TextBox2.Text & " - " & ComboBox1.Text
    7. If sfd.ShowDialog = Windows.Forms.DialogResult.OK Then
    8. Dim fi As New IO.FileInfo("S:\Allgemein_Software\Adobe_Photoshop_CS2_Beweissicherung\Source\Raumblatt Digitale Vorlage.psd")
    9. fi.CopyTo(sfd.FileName)
    10. Process.Start(sfd.FileName)
    11. End If
    12. End Using


    Ich wurschtl mich jetz noch ein bisschen selber durch, klappt ganz gut :)

    edit:

    okay, wenn das hier noch jemand liest, ich habe jetz meinen Savefiledialog eigentlich gut fertig.
    Jetz bau ich grad eine Checkbox ein, wenn diese False ist soll er mir den Savefiledialog aufbauen, wenn sie True ist soll er einfach bei buttonclick in das letzte geöffnete Verzeichnis des Savefiledialogs die Datei hinkopieren & Öffnen


    danke schonmal :)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Eiskaffee“ ()

    Darf ich davon ausgehen, dass Du Deinem Projekt Option Strict On gegeben hast?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ja darfst du :)

    Also, soweit eigentlich erledigt. Das Hauptproblem ist gelöst.

    Jetz ist ein neues aufgetreten:

    VB.NET-Quellcode

    1. Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click
    2. OpenFileDialog1.InitialDirectory = "N:\" + TextBox1.Text
    3. Using ofd As New OpenFileDialog()
    4. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
    5. Dim fi As New IO.FileInfo(ofd.FileName)
    6. fi.CopyTo(fi.DirectoryName & "\" _
    7. & IO.Path.GetFileNameWithoutExtension(fi.Name) & " - " & ComboBox1.Text & fi.Extension)
    8. End If
    9. End Using
    10. End Sub


    Hiermit kopiere ich durch den Klick auf OK im openfiledialog die datei und hänge den Inhalt einer Combobox dran.

    So, jetz nehmen wir mal an (und das passiert bestimmt absichtlich!) ich öffne eine bereits kopierte datei.
    Also:

    Original: Test
    1. Kopie: Test - Combobox1
    2. Kopie: Test - Combobox1 - Combobox1

    Die Combobox enthält 5 Einträge, ich will dass der in der Letztendlichen kopierten Datei alle möglichen Comboboxinhalte rausnimmt und den aktuellsten reinschreibt.

    Nochmal beispiel zum Verständis:

    am 01.02.2013 erstelle ich ein Original namens: Test.psd
    am 22.02.2013 überarbeite ich das dokument, kriegt dann durch die Combobox1 folgenden Namen: Test - 22.02.2013.psd
    am 04.03.2013 überarbeite ich dieses Dokument nocheinmal und jetzt soll im Prinzip einfach das was zwischen "-" und "." steht weg und der neue Combobox inhalt rein...

    Wie geht das?
    Wie du siehst is das in meinem Code ein bisschen schwer einen Eindeutigen Pfad festzulegen.

    Eigentlich soll er einfach den Aktuellen Inhalt der Combobox1 über den text zwischen "-" und "." legen.

    Ich steh aber grad sowas von auf dem Schlauch das ich nicht weiterkomme :/
    Warum das denn?

    Mit

    VB.NET-Quellcode

    1. Path.GetDirectoryName(FullPath)
    bekommst du den Pfad, mit

    VB.NET-Quellcode

    1. Path.GetExtension(FullPath)
    bekommst du die Extension etc.
    Mit der Split-Funktion aus dem Dateinamen ohne Pfad und Extension baust Du dir einen kürzeren Namen zusammen und mit

    VB.NET-Quellcode

    1. Path.Combine(IO.Path.GetTempPath, MeinNeuerName & MeineExtension")
    baust du alles wieder zusammen.
    Warum das denn?
    Weil ich mich nicht wirklich auskenne mit VB.

    Ich versteh nur Bahnhof grade...

    Wie wäre das denn in meinem Konkreten Fall?

    VB.NET-Quellcode

    1. Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click
    2. OpenFileDialog1.InitialDirectory = "N:\" + TextBox1.Text
    3. Using ofd As New OpenFileDialog()
    4. If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
    5. Dim fi As New IO.FileInfo(ofd.FileName)
    6. fi.CopyTo(fi.DirectoryName & "\" & IO.Path.GetFileNameWithoutExtension(fi.Name) & " - " & ComboBox1.Text & fi.Extension)
    7. End If
    8. End Using
    9. End Sub


    Ich hab mir schon überlegt bzw. auch ausprobiert ob ich nicht erst das ganze in einer unsichtbaren textbox rauslasse, dann im Verzeichnis danach suche und dann das ganze nach dem Kopiervorgang umbennene, aber keine chance, ich kriegs nicht hin :D
    Und es wär glaub ich auch zu umständlich?

    Das was mich stört ist ja folgendes:

    Original heißt : blub - erstbegehung
    Kopie 1 heißt : blub - erstbegehung - 1. Zwischenbegehung
    Kopie 2 heißt : blub - erstbegehung - 1. Zwischenbegehung - 2. Zwischenbegehung

    Was ich will:

    Original heißt: blub - erstbegehung
    Kopie 1 heißt: blub - 1. Zwischenbegehung
    Kopie 2 heißt: blub - 2. Zwischenbegehung


    Wie gesagt, kenne mich nicht gut aus... :(
    Warum verwendest Du 2 Instanzen von OpenFileDialog?

    Eiskaffee schrieb:

    VB.NET-Quellcode

    1. OpenFileDialog1.InitialDirectory = "N:\" + TextBox1.Text
    2. Using ofd As New OpenFileDialog()

    Schmeiß den aus dem Designer raus, verwende alle anderen mit Using.
    Dann sollte auch Deine InitialDirectory funktionieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Warum verwendest Du 2 Instanzen von OpenFileDialog?

    RodFromGermany schrieb:

    Eiskaffee schrieb:

    VB.NET-Quellcode

    1. OpenFileDialog1.InitialDirectory = "N:\" + TextBox1.Text
    2. Using ofd As New OpenFileDialog()

    Schmeiß den aus dem Designer raus, verwende alle anderen mit Using.
    Dann sollte auch Deine InitialDirectory funktionieren.

    Die initial directory ist überhaupt nicht das Problem O.o Funktioniert top aber du hast recht, kann ich rausnehmen, hatte anfangs was anderes, es funktioniert halt noch weil ich beim Designer aus der toolbox das ding reingezogen hab.


    VB.NET-Quellcode

    1. fi.CopyTo(fi.DirectoryName & "\" & IO.Path.GetFileNameWithoutExtension(fi.Name) & " - " & ComboBox1.Text & fi.Extension)


    kann ich hier irgendwo ein rename reinbauen? Ich habe in: IO.Path.GetFileNameWithoutExtension(fi.Name) sozusagen den alten namen stehen, also MIT "- Erstbegehung"... Kann ich hier schon irgendwas erreichen? Das ich ihm sage er soll beim Kopieren diesen Teil garnicht erst mitnehmen und NUR das NEUE "- 1. Zwischenbegehung" mit reinnehmen?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Eiskaffee“ ()

    Eiskaffee schrieb:

    VB.NET-Quellcode

    1. fi.CopyTo(fi.DirectoryName & "\" & IO.Path.GetFileNameWithoutExtension(fi.Name) & " - " & ComboBox1.Text & fi.Extension)
    Mach mal bei solch Zeilen 2 Zeilen draus und pack das Argument in eine String-Variable.
    Das macht sich beim Testen gut, ansehen im Debugger oder Ausgabe per MessageBox, um sich zu überzeugen, dass der Pfad tatsächlich der richtige ist.

    VB.NET-Quellcode

    1. Dim path = fi.DirectoryName & "\" & IO.Path.GetFileNameWithoutExtension(fi.Name) & " - " & ComboBox1.Text & fi.Extension
    2. ' MessageBox.Show(path)
    3. fi.CopyTo(path)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    ungeprüft und ohne extension

    VB.NET-Quellcode

    1. Dim fi As IO.FileInfo
    2. Dim splitter() As String = ofd.FileName.Split("-"c)
    3. If splitter.Length > 2 Then
    4. fi = New IO.FileInfo(splitter(0).Trim & " - " & splitter(2).Trim)
    5. Else
    6. fi = New IO.FileInfo(ofd.FileName)
    7. End If