Feedback

C# - Bestimmte Zeile einer Datei löschen

Veröffentlicht von am 12.04.2010
(1 Bewertungen)
Löscht die angegebende Zeile aus der Datei.

Update:
Nach den mehr oder weniger netten Hinweisen ändere ich mal das Snippet.

Benötigte Namespaces:
using System.IO;
        /// <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);
            }
        }
Abgelegt unter Datei, Zeilen.

4 Kommentare zum Snippet

hackman schrieb am 13.04.2010:
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
Christopher Wolf schrieb am 14.04.2010:
Hi Sven,

ich habe dein Snippet mal etwas "umgebaut" und das kam dabei raus:

/// <summary>
/// Löscht eine Zeile an der angegebenden Zeile
/// </summary>
/// <param name="fileName">Dateipfad</param>
/// <param name="line">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);
}
}


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
hackman schrieb am 21.05.2010:
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("\r\n", File.ReadAllLines(fileName, Encoding.Default).Where((l,idx) => idx != line).ToArray()), Encoding.Default);
Christopher Kk schrieb am 21.05.2010:
@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.
 

Logge dich ein, um hier zu kommentieren!