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?
Nimm doch einen FileStream mit FileAccess.ReadWrite.
Windows Server Advanced Power Management
Erweitertes Energie-Management unter Windows
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
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.
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
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.
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!