StreamWriter gibt einen System.IO:IOException Exception aus?

  • C#

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von a.b_om.

    StreamWriter gibt einen System.IO:IOException Exception aus?

    Hallo Community
    Ich habe eine "riesen" Liste in einem Programm erstellt und möchte diese in 64 Gruppen einteilen.
    Es funktioniert so, wie ich das möchte.

    Jetzt habe ich einen Fehler, der mir sehr bekannt ist, aber weil mir C# nicht sehr geläufig ist und ich auf dem
    Schlauch stehe, brauche ich Hilfe.

    Ich weiss, wenn ich die Word-Datei erstelle, wird der StreamWriter geöffnet.
    Wie schliesse ich dieses StreamWriter? Oder wie bekomme ich die Zeilen 107 - 140
    sauber und funktionierend geschrieben?

    Mein Code:
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.IO;
    4. namespace PZG
    5. {
    6. class Program
    7. {
    8. public static List<string> pL = new List<string>();
    9. static void Main(string[] args)
    10. {
    11. Random r = new Random();
    12. //Liste befuellen
    13. ...
    14. Console.WriteLine("Bitte nehmen Sie die noch benötigen Dateien aus dem <PG> Ordner auf dem Desktop! Die Dateien werden gelöscht und können nicht Wiederhergestellt werden.");
    15. Console.ReadLine();
    16. DirectoryInfo directory = new System.IO.DirectoryInfo(@"C:\Users\ProBook\Desktop\PG");
    17. string filepath = @"C:\Users\ProBook\Desktop\PG";
    18. //Word filepaths erstellen
    19. ...
    20. if (!Directory.Exists(filepath))
    21. {
    22. Directory.CreateDirectory(filepath);
    23. }
    24. foreach (FileInfo file in directory.GetFiles())
    25. {
    26. file.Delete();
    27. }
    28. int a = pL.Count;
    29. while (a > 1)
    30. {
    31. a--;
    32. int k = r.Next(a + 1);
    33. string value = pL[k];
    34. pL[k] = pL[a];
    35. pL[a] = value;
    36. }
    37. WriteGroupeInFile(filepath1);
    38. WriteGroupeInFile(filepath2);
    39. WriteGroupeInFile(filepath3);
    40. WriteGroupeInFile(filepath4);
    41. WriteGroupeInFile(filepath5);
    42. WriteGroupeInFile(filepath6);
    43. WriteGroupeInFile(filepath7);
    44. WriteGroupeInFile(filepath8);
    45. WriteGroupeInFile(filepath9);
    46. WriteGroupeInFile(filepath10);
    47. WriteGroupeInFile(filepath11);
    48. WriteGroupeInFile(filepath12);
    49. WriteGroupeInFile(filepath13);
    50. WriteGroupeInFile(filepath14);
    51. WriteGroupeInFile(filepath15);
    52. WriteGroupeInFile(filepath16);
    53. WriteGroupeInFile(filepath17);
    54. WriteGroupeInFile(filepath18);
    55. WriteGroupeInFile(filepath19);
    56. WriteGroupeInFile(filepath20);
    57. WriteGroupeInFile(filepath21);
    58. WriteGroupeInFile(filepath22);
    59. WriteGroupeInFile(filepath23);
    60. WriteGroupeInFile(filepath24);
    61. WriteGroupeInFile(filepath25);
    62. WriteGroupeInFile(filepath26);
    63. WriteGroupeInFile(filepath27);
    64. WriteGroupeInFile(filepath28);
    65. WriteGroupeInFile(filepath29);
    66. WriteGroupeInFile(filepath30);
    67. WriteGroupeInFile(filepath31);
    68. WriteGroupeInFile(filepath32);
    69. WriteGroupeInFile(filepath33);
    70. WriteGroupeInFile(filepath34);
    71. WriteGroupeInFile(filepath35);
    72. WriteGroupeInFile(filepath36);
    73. WriteGroupeInFile(filepath37);
    74. WriteGroupeInFile(filepath38);
    75. WriteGroupeInFile(filepath39);
    76. WriteGroupeInFile(filepath40);
    77. WriteGroupeInFile(filepath41);
    78. WriteGroupeInFile(filepath42);
    79. WriteGroupeInFile(filepath43);
    80. WriteGroupeInFile(filepath44);
    81. WriteGroupeInFile(filepath45);
    82. WriteGroupeInFile(filepath46);
    83. WriteGroupeInFile(filepath47);
    84. WriteGroupeInFile(filepath48);
    85. WriteGroupeInFile(filepath49);
    86. WriteGroupeInFile(filepath50);
    87. WriteGroupeInFile(filepath51);
    88. WriteGroupeInFile(filepath52);
    89. WriteGroupeInFile(filepath53);
    90. WriteGroupeInFile(filepath54);
    91. WriteGroupeInFile(filepath55);
    92. WriteGroupeInFile(filepath56);
    93. WriteGroupeInFile(filepath57);
    94. WriteGroupeInFile(filepath58);
    95. WriteGroupeInFile(filepath59);
    96. WriteGroupeInFile(filepath60);
    97. WriteGroupeInFile(filepath61);
    98. WriteGroupeInFile(filepath62);
    99. WriteGroupeInFile(filepath63);
    100. WriteGroupeInFile(filepath64);
    101. }
    102. private static void WriteGroupeInFile(string filepath)
    103. {
    104. if (!File.Exists(filepath))
    105. {
    106. File.Create(filepath);
    107. }
    108. using (StreamWriter writer = new StreamWriter(filepath))
    109. {
    110. int i = 1;
    111. foreach (string text in pL)
    112. {
    113. if (pL.Count < 14)
    114. {
    115. if (i >= 7)
    116. {
    117. writer.WriteLine(text);
    118. pL.RemoveAt(0);
    119. }
    120. }
    121. else
    122. {
    123. if (i >= 14)
    124. {
    125. writer.WriteLine(text);
    126. pL.RemoveAt(0);
    127. }
    128. }
    129. }
    130. }
    131. }
    132. }
    133. }

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „a.b_om“ ()

    a.b_om schrieb:

    Wie schliesse ich dieses StreamWriter?
    Der wird automatisch geschlossen, wenn das Ende using-Block in Z#137 erreicht wird. Aber wie ist denn der Wortlaut der Exception? Dass sie vom Typ IOException ist, reicht als Info nicht.

    Den Code könnte man wohl noch zusammenfassen zu ... eh, Moment. Was soll das i da in dem Code? Ändert sich doch nicht, ist ja ne ForEach-Schleife.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja, der nächste Kandidat. Hatten wir neulich in nem anderen Thread. File.Create erstellt nicht nur eine Datei, sondern öffnet auch einen Stream dahin. Und nochmal mit nem StreamWriter drauf zugreifen, ist nicht. Daher statt Create z.B. WriteAllText verwenden. Das erstellt eine neue Datei, ohne sie offen zu halten. Oder eben schreiben:

    C#-Quellcode

    1. if (!File.Exists(filepath))
    2. {
    3. FileStream fs = File.Create(filepath);
    4. fs.Close;
    5. }

    Ich hab noch in meiner 1. Antwort eine Ergänzungsfrage geschrieben.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Sorry, das i ist für eine Exception abfangen. Im Code fehlt ein i++;

    Edit:

    Das i ist für das nicht relevant.

    Ich werde es ausprobieren und dann melde ich mich wieder

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „a.b_om“ ()

    Ok, die (vermeintliche?) Lösung steht ja schon in Post#4.

    Zum Block eine mögliche Vereinfachung:

    C#-Quellcode

    1. foreach (string text in pL)
    2. {
    3. if (pL.Count < 14 && i >= 7 || pL.Count >= 14 && i >= 14)
    4. {
    5. writer.WriteLine(text);
    6. pL.RemoveAt(0);
    7. }
    8. }

    Sollte so klappen, auch wenn mein C# etwas eingerostet ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @a.b_om Dass das ganze ühaupt funktioniert verwundert mich, da die Aufzählung des ForEach beim .Remove(0) geändert wird.
    Ich würde da eher mit einer while-Schleife durchgehen und die Indizes zählen.
    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!