Sprache: C#
Löscht die angegebende Zeile aus der Datei.
Update:
Nach den mehr oder weniger netten Hinweisen ändere ich mal das Snippet.
Benötigte Namespaces:
[code]using System.IO;[/code]
/// <summary>
/// Löscht eine Zeile an der angegebenden Zeile
/// </summary>
/// <param name="sFilename">Dateipfad</param>
/// <param name="iLine">zu löschende Zeile</param>
private void RemoveLine(string fileName, int line)
{
// Datei existent, dann ...
if (File.Exists(fileName))
{
int counter = 1;
StringBuilder sb = new StringBuilder();
// Zeile für Zeile in der Datei durchlaufen
foreach (string s in File.ReadAllLines(fileName, Encoding.Default))
{
// wenn Zeile ungleich der zu löschenden Zeile ist, dann...
if (counter != line)
sb.AppendLine(s); // Zeile zum StringBuilder hinzufügen
counter++;
}
// mit Hilfe des StringBuilder Inhalts, die vorhandene Datei ersetzen
File.WriteAllText(fileName, sb.ToString(), Encoding.Default);
}
}
/// <summary>
/// Löscht eine Zeile an der angegebenden Zeile
/// </summary>
/// <param name="sFilename">Dateipfad</param>
/// <param name="iLine">zu löschende Zeile</param>
private void RemoveLine(string fileName, int line)
{
// Datei existent, dann ...
if (File.Exists(fileName))
{
int counter = 1;
StringBuilder sb = new StringBuilder();
// Zeile für Zeile in der Datei durchlaufen
foreach (string s in File.ReadAllLines(fileName, Encoding.Default))
{
// wenn Zeile ungleich der zu löschenden Zeile ist, dann...
if (counter != line)
sb.AppendLine(s); // Zeile zum StringBuilder hinzufügen
counter++;
}
// mit Hilfe des StringBuilder Inhalts, die vorhandene Datei ersetzen
File.WriteAllText(fileName, sb.ToString(), Encoding.Default);
}
}
Alte URL:
/snippet/bestimmte-zeile-einer-datei-loeschen/1374
sehr schlechtes snippet, weil
– es gibt eine funktion um eine datei komplett zeilenweise einzulesen (files.readall oder so ähnlich)
– wenn man schon texte zusammenhängt, dann bitte einen stringbuilder verwenden!! ansonsten allokiert man in jeder zeile wieder neuen speicher
– dateien immer in einem using statement öffnen und schließen
Hi Sven,
ich habe dein Snippet mal etwas „umgebaut“ und das kam dabei raus:
[code]
///
///
/// Dateipfad
/// zu löschende Zeile
private void RemoveLine(string fileName, int line)
{
// Datei existent, dann …
if(File.Exists(fileName))
{
int counter = 1;
StringBuilder sb = new StringBuilder();
// Zeile für Zeile in der Datei durchlaufen
foreach (string s in File.ReadAllLines(fileName, Encoding.Default))
{
// wenn Zeile ungleich der zu löschenden Zeile ist, dann…
if(counter != line)
sb.AppendLine(s); // Zeile zum StringBuilder hinzufügen
counter++;
}
// mit Hilfe des StringBuilder Inhalts, die vorhandene Datei ersetzen
File.WriteAllText(fileName, sb.ToString(), Encoding.Default);
}
}
[/code]
Das erfüllt die gleiche Aufgabe wie dein Snippet und ist wie gesagt nur abgeändert…
Ansonsten muss ich Hackman zustimmen in Hinsicht.
Hier ist ein Link zu einem Snippet wo verschiedene Wege aufgezeigt werden wie man eine Datei einlesen kann.
http://dotnet-snippets.de/dns/textdatei-einlesen-auf-verschiedene-arten-SID1331.aspx
man könnte hier streiten, ob ein string.join schneller als ein stringbuilder ist. auf jeden fall könnte man das wunderbar in einem linq ausdruck schreiben, in etwa
File.WriteAllText(fileName, String.Join(„rn“, File.ReadAllLines(fileName, Encoding.Default).Where((l,idx) => idx != line).ToArray()), Encoding.Default);
@hackman: Hast du ein Performancevergleich angestellt oder warum stellst du solche Vermutungen in den Raum? Zumal du in deinem ersten Post sogar zum Stringbuilder empfohlen hast.Also entweder vergisst du was jedesmal schreibst, liest deine alten Kommentare nicht oder es hat sich jemand unter deinem namen eingeloggt und macht Unsinn. Auf jedenfall Widersprichst du dir hier.