Laden...

StreamWriter Exception: The process cannot access the file x because it is being used ...

Erstellt von NewCoder vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.085 Views
N
NewCoder Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren
StreamWriter Exception: The process cannot access the file x because it is being used ...

Hey Leute,

habe ein kleines anwendungstechnisches Problem.
Also ich würde gerne mit meinem Programm direkt eine Datei auf der Festplatte des aktuellen Rechners erzeugen und dann sofort mit einem Stream Daten reinschreiben. Hier ein kleiner Auszug von meinem Programm


            File.Create(path+"\\nameDerDatei.csv");
            using (StreamWriter writer = new StreamWriter(path+"\\nameDerDatei.csv"))
            {
                for (int i = 0; i < data.Length; i++)
                {
                    writer.WriteLine(data[i]);
                }
            };


Als Exception erhalte ich:
The process cannot access the file 'C:\temp\nameDerDatei.csv' because it is being used by another process.

Weiß jemand, wie man diese Fehlermeldung umgehen kann?
Gruß
NewCoder

2.891 Beiträge seit 2004
vor 13 Jahren

Schonmal die File.WriteAllLines-Methode (System.IO) angeguckt?

D
67 Beiträge seit 2006
vor 13 Jahren

Nur eine Vermutung. Ist evtl. das erstellen der csv Datei noch nicht beendet, wenn du mittels StreamWriter zugreifst? Also das der Code zu schnell ausgeführt wird?

Testen könntest du es, in dem du den Thread mit Thread.Sleep(1000) für eine Sekunde oder länger kurz schlafen lässt.

Wäre es evlt. sinnvoller, die Datei erst im Speicher zu erstellen und anschließend auf die Platte zu schreiben?

„Ich erfand den Begriff «objekt-orientiert», und ich kann sagen, dass ich dabei nicht C++ im Sinn hatte.“ Alan Kay

1.346 Beiträge seit 2008
vor 13 Jahren

File.Create(path+"\nameDerDatei.csv"); erstellt die atei und öffnet sie. Sie ist nun nicht mehr für andere handles nicht schreib und lesbar. Deswegen kannst du sie dann nichtmehr mit dem StreamWriter öffnen.

            using (StreamWriter writer = new StreamWriter(File.Create(path+"\\nameDerDatei.csv")))
            {
                for (int i = 0; i < data.Length; i++)
                {
                    writer.WriteLine(data[i]);
                }
            };

Sollte funktionieren

N
NewCoder Themenstarter:in
4 Beiträge seit 2010
vor 13 Jahren

@dN!3L

Cool, funktioniert wunderbar.

@davidG
Habe das mal mit dem Thread.Sleep(1000) ausprobiert. Also der Erstellungsvorgang scheint schnell genug zu sein.

Wäre es evlt. sinnvoller, die Datei erst im Speicher zu erstellen und anschließend auf die Platte zu schreiben?

Mal so aus Interesse. Wie hätte ich die Datei zuerst im Speicher erzeugen können? Das Array mit den Daten existiert ja. Wie hätte ich die Datei im Speicher erzeugen können, ohne sie auf die Festplatte zu schreiben?

@pdelvo
Hätte ich es auch erzwingen können, dass ich von mehreren Ressourcen gleichzeitig in die Datei schreiben kann. Dann müsste ich aber zuerst ein FileStream Objekt erzeugen und dann den Parameter auf true setzen, der das Reinschreiben ermöglicht, oder?
Könnte es dann sein, dass es Probleme mit dem Schreiben gibt, da zwei Ressourcen darauf zugreifen, obwohl ja nur von einer Datei her geschrieben wird?

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

Wie hätte ich die Datei im Speicher erzeugen können, ohne sie auf die Festplatte zu schreiben?

Aus Sicht des Programms ist die Datei ja lediglich ein Stream, und zwar bei einer echten Datei ein FileStream. Das Äquvalent im Arbeitsspeicher wäre ein MemoryStream.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca