Laden...

Datei gleichzeitig lesen und schreiben

Erstellt von Quallo vor 18 Jahren Letzter Beitrag vor 18 Jahren 6.972 Views
Q
Quallo Themenstarter:in
992 Beiträge seit 2005
vor 18 Jahren
Datei gleichzeitig lesen und schreiben

Ich muss in einer Datei bestimmte Zeichen ersetzen. Wie geht das am einfachsten?
Ich möchte gerne ohne temporäre Datei auskommen, aber wenn ich versuche die Datei gleichzeitig mit einem Streamreader und einem Streamwriter zu öffnen, gibt es(logischerweise) einen Fehler.

Gibt es da eine einfache Lösung für?

210 Beiträge seit 2005
vor 18 Jahren

Nimm doch einen FileStream mit FileAccess.ReadWrite.

Blog

Portable WebDAV Library

Windows Server Advanced Power Management
Erweitertes Energie-Management unter Windows

P
939 Beiträge seit 2003
vor 18 Jahren

Was gibt es für einen Fehler?

Meiner Meinung nach müsste es funktionieren. Ich habe es allerdings nicht ausprobiert.

Zum Testen würde ich erstmal versuchen, direkt mit einem Stream zu hantieren, ohne Reader und Writer.

Zum Beispiel so.

byte[] data = new byte[5];
Stream stream = File.Open(fileName, FileMode.Open, FileAccess.ReadWrite);

// 5 Bytes lesen (vereinfacht).
int readCount = stream.Read(data, 0, 5);

// File-Pointer an Position 10 verschieben.
stream.Seek(10, SeekOrigin.Begin);

// 5 Bytes schreiben.
stream.Write(data, 0, 5);

stream.Close();

Wenn das funktioniert kannst du es nochmal mit StreamReader und StreamWriter probieren. Was ich noch gesehen habe, ein BufferedStream darf nicht dazwischenhängen.

Gruss
Pulpapex

T
55 Beiträge seit 2005
vor 18 Jahren

Hallo Quallo,

nimm doch die FileStream Klasse mit FileAccess.ReadWrite


string MyFile = @"C:\test.txt";
// Create file if not exists
if (!File.Exists(MyFile))
{
	// Creating
	using (FileStream fs = File.Create(MyFile))
	{
		// write first line
		Byte[] myText = new UTF8Encoding(true).GetBytes("Hallo Welt 1");
		fs.Write(myText, 0, myText.Length);
	}
}

// Reopen the file and read and append text
using (FileStream fs = File.Open(MyFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
	byte[] myText = new byte[1024];
	UTF8Encoding temp = new UTF8Encoding(true);

	// Read now
	while (fs.Read(myText, 0, myText.Length) > 0) 
	{
		Console.WriteLine(temp.GetString(myText));
	}

	// Write some Text now
	Byte[] myNextText = new UTF8Encoding(true).GetBytes("Hallo Welt 2");
	fs.Write(myNextText, 0, myNextText.Length);
}

[EDIT]
Hab wohl beim tippen ein bischen lange gebraucht. 😁
[/EDIT]

Gruß tzun

Gott gab uns die Nüsse - knacken müssen wir sie.

Q
Quallo Themenstarter:in
992 Beiträge seit 2005
vor 18 Jahren

Danke erstmal!

Um genau zu sein brauche ich eine Methode um Bestimmte Zeichen in einer Datei durch andere zu ersetzen. Also soetwas wie String.Replace nur für ganze Dateien.

Mal kurz ein wenig Quellcode:

			FileInfo fi = new FileInfo(this.textBox1.Text);
			StreamReader sr = new StreamReader(this.textBox1.Text,System.Text.Encoding.Default);
			StreamWriter sw = new StreamWriter(fi.FullName.Substring(0,fi.FullName.LastIndexOf(".")) + ".edited" + fi.Extension,false,System.Text.Encoding.Default);

			sw.Write(sr.ReadToEnd().Replace(Environment.NewLine,"\n").Replace("\n\n","\n"));
			
			sr.Close();
			sw.Close();

			this.progressBar1.Value++;

Im Moment wird es in eine andere Datei ausgespuckt. Soll aber praktisch wieder in der gleichen landen.
Ich könnte jetzt einen großen String als Puffer nehmen, dann den Streamreader schließen, den Streamwriter öffnen und dann schreiben. Ist das die einfachste Möglichkeit?

Grüße Christoph

S
8.746 Beiträge seit 2005
vor 18 Jahren

Quallo:

Deine Idee "auf der gleichen Datei" zu arbeiten mag auf den ersten Blick charmant zu sein, weil u.U. performanter.

Tatsächlich ist eine solche Lösung UNSICHER. Stelle dir vor, deine Anwendung stürzt mittendrin ab, der Strom fällt aus, was auch immer. Dann ist deine Datei "halb" modifiziert. Nur in Fällen, wo Ersetze(Ersetze(File)) = Ersetze(File) ist, ist das zumindest technisch unkritisch, aus Sicht des User trotzdem unklar, wie nun der Zustand seiner Datei ist.

Wähle daher lieber die Lösung via Temp-File.

Q
Quallo Themenstarter:in
992 Beiträge seit 2005
vor 18 Jahren

Ist ne absolut unkritische Geschichte, deswegen ist die Sicherheit zu 99% egal!
Wenn es um etwas wichtiges ginge, dann würde ich mich allein schon wegen der Frage ob das nicht direkt geht selber Ohrfeigen g!

Das könnte aber ein Grund sein, warum es solche Klassen nicht gibt.

Da es sich nur um ein kleines Tool handelt und das ganze nur ein Nice-To-Have-Feature gewesen wäre, kann der Thread meinetwegen geschlossen werden.

VIELEN DANK AN ALLE!