none
Warum reicht das Ereignis EXISTS alleine nicht aus? RRS feed

  • Frage

  • Hallo Leute, ich nutze momentan folgenden Code:

     //da das C#-Eriegnis Exists in dieser Applikation nicht zuverlässige Werte zurückliefert, wurde diese Variable initialisert. Sie dient zur Absicherung 
            private bool CreateDirectory = true;
    .
    .
     //sichert die Statistikdaten in einer Textdatei mit der Endung 'stat'
            private void button4_Click(object sender, EventArgs e)
            {
                string StringToSave = "";
                string filename = "statistic.stat";
                if (!Directory_Statistic.Exists && CreateDirectory)
                {
                    if (MessageBox.Show("Um die Statistikauswertungen zu sichern, muss das Verzeichnis " + Directory_Statistic + " neu angelegt werden. Wollen Sie das Verzeichnis anlegen?", "Hint", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        Directory.CreateDirectory(Directory_Statistic.ToString());
                        CreateDirectory = false;
                        if (ShowInfo)
                            MessageBox.Show(Directory_Statistic + " wurde neu angelegt");
                    }
                    else
                    {
                        MessageBox.Show("Die Statistik kann nicht gesichert werden", "Important Note", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                }
                if (Directory_Statistic.Exists || !CreateDirectory)
                {
                    foreach (string listContent in listBox1.Items)
                    {
                        if (listContent != Environment.NewLine)
                            StringToSave += listContent + Environment.NewLine;
                    }
                    File.AppendAllText(Directory_Statistic + "/" + filename, StringToSave);
                    if (ShowInfo)
                        MessageBox.Show(" Der Inhalt der Statistik wurde in der Datei " + Directory_Statistic + "/" + filename + " gesichert");
                }
            }

    Warum klappt das nicht, ohne die boolsche Variable? Ohne diese Variable passiert folgendes:

    Wenn ich den Filedialog mit 'Ja' beantworte wird das Verzeichnis erstellt. Drücke ich wieder auf den Button, wird das Verzeichnis nicht erkannt, der Dialog erscheint wieder. Erst nachdem ich die Applikation neu gestartet habe wird das Verzeichnis erkannt. Was begründet dieses seltsame Verhalten?




    • Bearbeitet tklustig Mittwoch, 4. Juli 2018 17:15
    Mittwoch, 4. Juli 2018 17:08

Antworten

  • Hallo,

    Du könntest auch:

    if (System.IO.Directory.Exists("<Path>"))
    {
    
    }

    nutzen, dann brauchst Du die variable Directory_Statistic nicht mehr


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Mittwoch, 4. Juli 2018 21:09
  • Hi,

    ich glaub, ich weiß jetzt, wo dein Verständnisproblem liegt.

    Wie Thomas schon richtig geschrieben hat, kannst Du auch Directory.Exists( Pfad ) verwenden. Das ist eine Methode, die jedesmal, wenn sie aufgerufen wird, prüft, ob das Verzeichnis existiert.

    DirectoryInfo.Exists hingegen (und das ist das, was Du verwendest) ist eine Eigenschaft, die lediglich zu dem Zeitpunkt der Erstellung der DirectoryInfo Instanz einmalig durch entsprechende Prüfung gesetzt wird. Wenn dann zwischenzeitlich das Verzeichnis erstellt wurde, ändert sich der Zustand für die DirectoryInfo Instanz nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Donnerstag, 5. Juli 2018 06:12
    Moderator

Alle Antworten

  • Hi,

    wo genau liest Du denn die Informationen für die Variable "Directory_Statistic" aus?

    Ich sehe das nirgends in deinem Code. Und da ich annehme, dass Du das eben nur einmal machst, ist auch klar, dass eine Abfrage auf die Exists Eigenschaft immer nur diesen initialen Wert (in deinem Fall "False") zurückgeben wird.

    Lies die Info also bspw. in "button4_Click" vor deiner Abfrage auf Exists neu aus. Wie genau, kann ich dir mangels deines Codes nicht sagen. Wahrscheinlich sowas wie:

    Directory_Statistic = New DirectoryInfo( "<Pfad>" );


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 4. Juli 2018 21:02
    Moderator
  • Hallo,

    Du könntest auch:

    if (System.IO.Directory.Exists("<Path>"))
    {
    
    }

    nutzen, dann brauchst Du die variable Directory_Statistic nicht mehr


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Mittwoch, 4. Juli 2018 21:09
  • Hi,

    ich glaub, ich weiß jetzt, wo dein Verständnisproblem liegt.

    Wie Thomas schon richtig geschrieben hat, kannst Du auch Directory.Exists( Pfad ) verwenden. Das ist eine Methode, die jedesmal, wenn sie aufgerufen wird, prüft, ob das Verzeichnis existiert.

    DirectoryInfo.Exists hingegen (und das ist das, was Du verwendest) ist eine Eigenschaft, die lediglich zu dem Zeitpunkt der Erstellung der DirectoryInfo Instanz einmalig durch entsprechende Prüfung gesetzt wird. Wenn dann zwischenzeitlich das Verzeichnis erstellt wurde, ändert sich der Zustand für die DirectoryInfo Instanz nicht.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Donnerstag, 5. Juli 2018 06:12
    Moderator
  • War tatsächlich ein Verständnisproblem. Ich unterschied schlichtweg nicht zwischen Ereignis und Methode.

    P.S: So habe ich das Verzeichnis initialisert:

            //instanziert ein Objekt der Klasse DirectoryInfo mit obigem Parameter für den Konstruktor der Klasse DirectInfo
            private DirectoryInfo Directory_Statistic = new DirectoryInfo(@"C:\Users\" + userName + "/Documents/Vokabelprogramm/Stat");

    Es ist aber auch irreführend für ein und denselben Sachverhalt zwei Komponenten zur Verfügung zu haben!
    • Bearbeitet tklustig Donnerstag, 5. Juli 2018 14:53
    Donnerstag, 5. Juli 2018 14:52