Autor Beitrag
Unknowen
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 17.05.10 09:45 
Hallo Forum,

im folgenden Skriptausschnitt aus einem Konsolenprogramm habe ich ein Problem:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:\_test\test.txt"false);
sw.Dispose();
sw.Close();

// Nur, damit Anwendung noch nicht geschlossen wird
Console.ReadLine();

Ich möchte eine Datei zippen und die "Originaldateien" anschließend löschen. Hier der Einfachheit halber nur auf mein Problem gekürzt, da das Zippen soweit schon funktioniert.

Das anschließende Löschen funktioniert aber nicht - er meldet mir, dass die Datei noch verwendet wird.

Demnach habe ich obiges Skript mal ausprobiert. Mit Dispose() und Close() wollte ich die Datei wieder "freigeben", aber solange die Konsolenanwendung noch offen ist, erscheint stets "Dieser Prozess wird noch verwendet [...]" wenn ich auf die soeben erstellte Datei zugreifen will.

Dachte eigentlich auch erst, dass es zu diesem Problem mit sehr großer Wahrscheinlichkeit einige Lösungen gibt, konnte aber nirgendwo etwas passendes finden - keine Ahnung, ob ich hier einfach nur blind bin und den Wald vor lauter Bäumen nicht sehe. :roll:
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 17.05.10 10:05 
Hallo und :welcome:,

also bei mir funktioniert das einwandfrei. Wenn aber test.txt deine Orginaldatei ist, solltest du dann nicht aus dieser lesen? StreamWriter ist wohl eher zum schreiben und demnach wohl deine Ausgabedatei. Was wiederum bedeutet das hier entweder der Code oder dein Text falsch ist.

Generell ist es besser, wenn du Objekte die das IDisposable Interface implementieren in einen using-Block packst. Dann sollte das mit dem Zugriff auch ganz deutlich sehen.

Gruß
Unknowen Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 17.05.10 10:33 
Hi danielf,


danke schonmal für die Hinweise. :) Hab das Skript demnach auch gleich mal in einen using-Block gepackt (hoffe, das passt so, funktioniert jedenfalls - wenn nicht, korrigier mich bitte).
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
using (System.IO.StreamWriter strw = new System.IO.StreamWriter(@"C:\_test\test.txt"false))
{
    strw.Dispose();
    strw.Close();
}

Console.ReadLine();

Liegt wohl eher an meiner Beschreibung zum Code, test.txt ist für mich lediglich (irgend)eine Datei, die ich erstelle. Hat in dem Fall jetzt auch gar nichts mit dem Zippen selbst zu tun, da mein Problem schon hier auftritt.

Das Programm läuft soweit durch, erstellt die Datei test.txt und wartet auf eine Benutzereingabe. Wenn ich jetzt versuche, die Datei (ganz normal, unter Windows) umzubenennen oder zu löschen, erscheint folgende Fehlermeldung:
Zitat:
Fehler beim Umbenennen der Datei oder des Ordners
test kann nicht umbenannt werden: Die Datei wird von einer anderen Person bzw. einem anderen Programm verwendet.
Schließen Sie alle Programme, die die Datei eventuell verwenden können, und wiederholen Sie den Vorgang.

Sobald ich die Konsolenanwendung beende, kann ich die Datei umbenennen.

Ich möchte die Datei aber auch schon verändern (bzw. löschen) können, wenn mein Programm noch läuft - deswegen wollte ich sie ja auch mit Dispose() und Close() "freigeben" (was aus mir unersichtlichen Gründen nicht möglich ist).
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 17.05.10 10:43 
Das ist mir klar und genau dies funktioniert bei mir auch einwandfrei. Vlt. sollte eine dritte Partei dies testen, da wir wohl so nicht weiter kommen.

Bzw. Zeile 3 + 4 brauchst du wegen dem using-Block nicht mehr.

Gruß
Unknowen Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 17.05.10 11:09 
Ooooh man, ich könnt mich grad in die Tonne treten. :(

Hab meinen Fehler jetzt gefunden. Ich hab für mich relevante Codeteile auskommentiert und obiges Skript getestet. Doofer Weise war das bei einer ausgelagerten Funktion nicht der Fall - diese hat den kompletten Inhalt des Ordners (der auch für test.txt angegeben war) gezippt. Und in dieser lag auch der Fehler. Man sollte eben immer modular testen. :roll:

Habe dort ein FileStream-Objekt erstellt, welches nicht wieder geschlossen wurde. Ist mir jetzt gerade aufgefallen, als ich mein Skript durchgegangen bin und using-Blöcke eingebaut hab (also dank deinem Tipp).

Da helfen using-Blöcke wirklich ungemein - vielen vielen, lieben Dank. :)
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mo 17.05.10 11:25 
So soll es sein :D

Viel Spaß & Erfolg