Prüfen ob datei vorhanden ist, falls nicht erstellen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ChOoSeMyNaMe.

    Prüfen ob datei vorhanden ist, falls nicht erstellen

    Hallo Leute,
    ich stehe gerade vor einem etwas schwierigerem Problem.

    Ich möchte auf buttonklick feststellen ob die Datei "xy.txt" vorhanden ist.
    Nur wenn ich das folgendermaßen mache und die Datei aber nicht vorhanden ist funktioniert es nicht da es damit beginnt dass die variable nicht definiert wird:

    C#-Quellcode

    1. var dir = Directory.GetCurrentDirectory();
    2. var dirr = dir + @"\xy.txt";
    3. if (File.Exists(dirr))
    4. {
    5. //... und so weiter
    6. }


    Ich bräuchte etwas womit ich herausfinden kann ob die Datei da ist und falls dies der Fall ist dann soll nur der Text in der Datei überschrieben werden (Schreiben mit StreamWriter ist kein Problem).

    Und falls die Datei nicht vorhanden ist soll sie erstellt werden.

    Ich habe es schon mit

    C#-Quellcode

    1. if (File.Exists(Directory.GetCurrentDirectory() + @"\xy.txt")){
    2. //...
    3. }

    versucht aber das klappt nicht da ein "+" nicht reinkann...

    Danke für eure Antworten im vorraus :)

    MFG Lukas
    Ich verstehe Dein Problem nicht zu 100%. Schau Dir auf jeden Fall mal Path.Combine an.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ok ehm ich versuchs mal etwas ausführlicher:

    Ich habe in einem Leeren Ordner mein Programm und eine "minecraft_server.jar"

    Nun muss ja wenn man den Server noch nicht gestartet hat den Server erst einmal "vorlaufen" lassen, damit sich die eula.txt erstellt.
    Heißt beim ersten start ist die Datei "eula.txt" noch nicht vorhanden.
    Also muss das Programm dann das erkennen und dann die Datei einlesen (nachdem sie erstellt wurde) und dann überschreiben.

    Beim zweiten oder 10 start des Programmes ist es ja sinnlos diese "eula.txt" immer wieder neu erstellen bzw. überschreiben zu lassen.

    Hier mein alter Code den ich versucht habe zu überarbeiten, denn gleich wenn man das Programm startet und die "eula.txt" nicht vorhanden ist kommt die erste Fehlermeldung ob man das Programm nicht beenden möchte.

    C#-Quellcode

    1. if (File.Exists("start.bat"))
    2. {
    3. Process start = new Process();
    4. start.StartInfo.UseShellExecute = false;
    5. start.StartInfo.CreateNoWindow = true;
    6. start.StartInfo.FileName = "start.bat";
    7. start.Start();
    8. System.Threading.Thread.Sleep(5000);
    9. start.Kill();
    10. System.Threading.Thread.Sleep(500);
    11. var dir1 = Directory.GetCurrentDirectory();
    12. var dirr2 = dir1 + @"\eula.txt";
    13. if (File.ReadAllLines(dirr2).Any(line => line.Contains("eula=true")))
    14. {
    15. }
    16. else
    17. {
    18. string titelmsg = "Achtung!";
    19. string messagemsg = "Mit einem Klick auf 'Ja' akzeptieren sie die eula dieses Spieles";
    20. MessageBoxButtons buttonsmsg = MessageBoxButtons.YesNo;
    21. DialogResult resulteula = MessageBox.Show(messagemsg, titelmsg, buttonsmsg);
    22. if (resulteula == DialogResult.Yes)
    23. {
    24. string[] texteula = new string[3] { "", "", "eula=true" };
    25. var dir = Directory.GetCurrentDirectory();
    26. var dirr = dir + @"\eula.txt";
    27. using (StreamReader readeula = new StreamReader(dirr))
    28. {
    29. while (readeula.Peek() >= 0)
    30. {
    31. string zeileeins = readeula.ReadLine();
    32. string zeilezwei = readeula.ReadLine();
    33. string zeiledrei = readeula.ReadLine();
    34. texteula[0] = zeileeins;
    35. texteula[1] = zeilezwei;
    36. }
    37. }
    38. using (StreamWriter eula = new StreamWriter(dirr))
    39. {
    40. foreach (string kommtrein in texteula)
    41. {
    42. eula.WriteLine(kommtrein);
    43. }
    44. }
    45. }
    46. else
    47. {
    48. label2.Text = "Sie müssen die eula akzeptieren falls sie spielen wollen.";
    49. }
    50. /* ende eula.txt teil */
    51. }
    52. Process start2 = new Process();
    53. start2.StartInfo.UseShellExecute = false;
    54. start2.StartInfo.CreateNoWindow = false;
    55. start2.StartInfo.FileName = "start.bat";
    56. start2.Start();
    57. }
    58. else
    59. {
    60. MessageBox.Show("Fehler! Keine startdatei gefunden!");
    61. }


    Hier ist das ganze auf die Datei "start.bat" aufgebaut, das klappt aber leider nicht so wie ich es gerne hätte...
    Also du willst den Server starten, dann die eula akzeptieren und den Server erneut starten?
    Das sollte meines Wissens recht einfach mit dem FileSystemWatcher funktionieren, der wirft dir (afaik asynchrone, nutze das Ding sehr selten) Events, wenn Dateien oder Ordner geändert werden. Desweiteren würde ich den Code zum akzeptieren stark vereinfachen bspw so:

    VB.NET-Quellcode

    1. Dim text As String = IO.File.ReadAllText("eula.txt")
    2. If text.Contains("eula=false") Then
    3. If MessageBox.Show("eula-text", "Eula", MessageBoxButtons.YesNoCancel) = DialogResult.Yes Then
    4. text.Replace("eula=false", "eula=true")
    5. End If
    6. End If
    7. IO.File.WriteAllText("eula.txt", text)

    Desweiteren würde ich rein aus Prinzip noch die Eula für den Nutzer laden bspw per Request, damit der auch die Möglichkeit bekommt diese durchzulesen.
    Außerdem würde das ganze Schlafen legen des Threads lassen, nutze lieber die Events des Prozesses. Diese werfen dir ein Event, wenn sie sich schließen.
    Auch würde ich das nicht über eine Batch starten sondern direkt.
    Du solltest am besten auch einfach "start" neu instanzieren, statt "start2". Mit ProcessStartInfo geht das ja recht schnell.

    LG

    Edit: Die Strings musst du noch anpassen.
    Danke für deine schnelle Antwort.

    Werde ich so einbauen.
    Eine zusätzliche Frage hab ich dann noch:

    Ich hab mich gerade etwas mit dem BackgroundWorker beschäftigt.
    Wäre es besser wenn er den ersten Start der .jar datei übernimmt?
    Backgroundworker ist immer schrott - seit 2012 gibt es um Welten bessere Ansätze.

    Aber es wäre insgesamt falsch, Threading einzubauen, wenn es kein Problem gibt, was dadurch gelöst wird.
    Also dass du uns fragst, ob das besser wäre ist ein deutlicher Hinweis, dasses da gar kein Problem gibt, sonst hättest du es ja benannt, oder?
    Danke für deine Antwort.

    Ich hab nur gedacht weil ich ja warten muss bis er beim ersten mal die Dateien erstellt hat, und das dauert so ungefähr 5 Sekunden.
    Und in dieser Zeit kann man nicht mit dem Programm interagieren.

    Was wären denn z.B bessere ansätze?
    Meines Wissens nach, beendet sich der Server immer mit einer Fehlermeldung beim Start, wenn die Eula nicht akzeptiert ist. Das heißt, du musst einfach nur das ProcessExit-Event abonnieren und dann überprüfen ob es an der Eula liegt(bspw mit meinem Code).

    LG