Announcement

Collapse
No announcement yet.

OpenFileDialog Probleme mit InitialDirectory

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • OpenFileDialog Probleme mit InitialDirectory

    Halli Hallo,

    habe wie der Titel schon sagt ein kleines Problem mit dem Initialisierungsverzeichnis bei dem OpenFileDialog von Windows Forms.

    Ich habe eine Anwendung geschrieben welche über eine kleine GUI bedienbar ist. Für die Anwendung können unabhängig zwei Dateipfade gewählt werden ( 2 verschiedene OpenFileDialoge ).

    Zu Anfang Initialisiere ich zwei strings mit dem aktuellen Dateipfad in meiner WinForms Klasse
    Code:
    private string Dir1 = Directory.GetCurrentDirectory();
    private string Dir2 = Directory.GetCurrentDirectory();
    Dies stellt soweit auch noch kein Problem dar.
    Meinen Filedialog rufe ich dann wie folgt auf:
    Code:
     private void button_path1_Click(object sender, EventArgs e)
            {
                OpenFileDialog openfiledialog_1 = new OpenFileDialog();
                openfiledialog_1.InitialDirectory = Dir1;
                openfiledialog_1.Filter = "Vector BLF (*.blf)|*.blf|All files (*.*)|*.*";
                openfiledialog_1.FilterIndex = 1;
                openfiledialog_1.RestoreDirectory = true;
                if (openfiledialog_1.ShowDialog() == DialogResult.OK)
                {
                    textBoxFile1.Text = openfiledialog_1.FileName;
                    Dir1 = openfiledialog_1.FileName;
                }
            }
    private void button_path2_Click(object sender, EventArgs e)
            {
                OpenFileDialog openfiledialog_2 = new OpenFileDialog();
                openfiledialog_2.InitialDirectory = Dir2;
                openfiledialog_2.Filter = "Vector BLF (*.blf)|*.blf|All files (*.*)|*.*";
                openfiledialog_2.FilterIndex = 1;
                openfiledialog_2.RestoreDirectory = true;
                if (openfiledialog_2.ShowDialog() == DialogResult.OK)
                {
                    textBoxFile2.Text = openfiledialog_2.FileName;
                    Dir2 = openfiledialog_2.FileName;
                }
            }
    Beim dem jeweils ersten Klicken auf den jeweiligen Button wird der Filedialog auch vollkommen korrekt mit dem in Dir1 bzw Dir2 gespeicherten Verzeichnis aufgerufen.
    D.h. ich wähle für Dir1 ein Verzeichnis und öffne danach den Filedialog für Dir2, welcher dann auch im richtigen Verzeichnis öffnet ( dem ursprünglichen Verzeichnispfad --> siehe Initilalisierung oben )
    Wähle ich nun hier auch einen neuen Pfad ( und bestätige ) und öffne danach wieder den Filedialog für Dir1 , so wird dieses in dem eben gewählten Pfad aus Filedialog2 geöffnet.

    Um es noch mal kurz zusammenzufassen -> Das erste öffnen des Filedialoges funktioniert bei beiden Verzeichnissen, danach wird jedoch immer der zuletzt geöffnete Pfad geöffnet egal welchen Filedialog ich öffne.
    Im Code hab ich aber beide strikt getrennt.
    Ich hoffe ich konnte es einigermaßen erklären was mein Problem ist.
    Viele Grüße

    Tobias

  • #2
    Code:
                    Dir1 = openfiledialog_1.FileName;
    Bei den folgenden Aufrufen steht ein Pfad auf einen Dateinamen in Dir1 und nicht nur ein Verzeichnis. Das ist dann beim zuweisen auf InitialDirectory ungültig und es zieht der Default.

    Zitat aus der Msdn Doku bezüglich des Defaults
    Wenn InitialDirectory nicht nur auf einen Verzeichnispfad, sondern auf einen vollständigen Dateinamen festgelegt ist, ist der Standardpfad des Ausgangsverzeichnisses entweder der Anwendungspfad oder das Verzeichnis, in dem der Benutzer zuletzt eine Datei ausgewählt hat.

    Comment


    • #3
      Hey,

      erstmal vielen Dank für die Antwort!

      Also nur damit ich das richtig verstehe , es ist also so , dass er übergreifend über beide OpenFileDialoge sich merkt in welchem Verzeichnis zuletzt eine Datei geöffnet und dieses dann für alle OpenFileDialoge nimmt?

      Gibt es ne elegeante Lösung das zu umgehen? OpenFileDialog hat ja leider kein Member der nur den Pfad enthält...also wäre ja die naheliegendste Lösung den string dann einfach um den Dateinamen zu kürzen, oder?
      Viele Grüße

      Tobias

      Comment


      • #4
        So weit ich weiß merkt sich ein FileDialog gar nichts sondern ändert beim Übernehmen im Dialog die WorkingDirectory der Anwendung. Beim nächsten öffnen eines FileDialogs öffnet er dann halt standardmäßig die aktuelle WorkingDirectory, die wenn sonst kein anderer dran rumgespielt hat eben vom letzten benutzen eines Filedialogs stammt. Wenn man das nicht so will muss man halt selbst immer die InitialDirectory (dann aber richtig ) setzen.

        Wenn du das überprüfen willst (wie gesagt ich vermute nur) kannst du die aktuelle WorkingDirectory über Environment.CurrentDirectory ermitteln.

        Comment


        • #5
          Hey,

          also wenn man als InitialDirectory einen Pfad mit Dateinamen angibt dann wird das InitialDirectory ( wie du bereits vollkommen richtig in deiner ersten Antwort gesagt hast ) automatisch das Anwedungsverzeichnis oder ( wie bei mir ), das letzte Verzeichnis in dem eine Datei ausgewählt wurde. Wichtig ist hierbei, dass dies sich auf alle Objekte der Klasse OpenFileDialog gleichermaßen bezieht, egal ob es verschiedene Instanzen sind.

          Hab mir jetzt nen Mini Workaround gebastelt um das zu umgehen:
          statt
          Code:
          Dir1 = openfiledialog_1.FileName;
          einfach
          Code:
          Dir1 = (openfiledialog_1.FileName).Substring(0,(openfiledialog_1.FileName).LastIndexOf("\\"));
          damit wird der Dateiname abgeschnitten und man kann den String somit als Wert für das InitialDirectory zuweisen! ( das ganze natürlich dann auch für Dir2 machen ).

          Vielen Dank nochmal für die Hilfe und viele Grüße

          Tobias

          Comment


          • #6
            Um einen Path zu zerlegen bringt das Framework schon die Path Klasse (in System.IO) mit.
            In deinem Fall sollte z.B. ein

            [Highlight=VB.net]Dir1 = Path.GetDirectoryName(openfiledialog_1.FileName)[/Highlight]

            reichen

            Comment


            • #7
              Gerade getestet - geht auch und ist sogar noch ne spur eleganter Danke!

              Comment

              Working...
              X