Einfachste Möglichkeit, aus Dateien zu lesen und in diese zu schreiben

341

Es gibt viele verschiedene Möglichkeiten, Dateien ( Textdateien , nicht binär) in C # zu lesen und zu schreiben .

Ich brauche nur etwas, das einfach ist und die geringste Menge an Code verwendet, da ich in meinem Projekt viel mit Dateien arbeiten werde. Ich brauche nur etwas, stringda ich nur strings lesen und schreiben muss .

ApprenticeHacker
quelle

Antworten:

544

Verwenden Sie File.ReadAllText und File.WriteAllText .

Einfacher geht es nicht ...

MSDN-Beispiele:

// Create a file to write to.
string createText = "Hello and Welcome" + Environment.NewLine;
File.WriteAllText(path, createText);

// Open the file to read from.
string readText = File.ReadAllText(path);
vc 74
quelle
2
Sehr einfach, aber warum musste die Frage dann gestellt werden? OP war wahrscheinlich, wie ich und die 17 Aufsteiger, in die "falsche" Richtung zu schauen string.Write(filename). Warum ist die Microsoft-Lösung einfacher / besser als meine?
Roland
7
@Roland, In .net wird die Dateiverwaltung vom Framework bereitgestellt, nicht von den Sprachen (es gibt keine C # -Schlüsselwörter zum Deklarieren und Bearbeiten von Dateien). Strings sind ein häufigeres Konzept, das so häufig vorkommt, dass es Teil von C # ist. Daher ist es natürlich, dass Dateien über Zeichenfolgen Bescheid wissen, aber nicht das Gegenteil.
VC 74
Xml ist auch ein gängiges Konzept mit Datentypen in C # und hier finden wir zB XmlDocument.Save (Dateiname). Der Unterschied besteht natürlich darin, dass normalerweise ein XML-Objekt einer Datei entspricht, während mehrere Zeichenfolgen eine Datei bilden.
Roland
7
@ Roland, wenn Sie unterstützen möchten, "foo".Write(fileName)können Sie einfach eine Erweiterung erstellen, um dies zu tun public static Write(this string value, string fileName) { File.WriteAllText(fileName, value);}und es in Ihren Projekten zu verwenden.
Alexei Levenkov
1
Es gibt auch File.WriteAllLines (Dateiname, Zeichenfolge [])
Mitch Wheat
162

Zusätzlich zu File.ReadAllText, File.ReadAllLinesund File.WriteAllText(und ähnlichen Helfern aus der FileKlasse), die in einer anderen Antwort angezeigt werden , können Sie StreamWriter/ StreamReaderclasses verwenden.

Schreiben einer Textdatei:

using(StreamWriter writetext = new StreamWriter("write.txt"))
{
    writetext.WriteLine("writing in text file");
}

Textdatei lesen:

using(StreamReader readtext = new StreamReader("readme.txt"))
{
   string readText = readtext.ReadLine();
}

Anmerkungen:

  • Sie können readtext.Dispose()anstelle von verwenden using, aber es wird Datei / Leser / Schreiber in Ausnahmen nicht geschlossen
  • Beachten Sie, dass der relative Pfad relativ zum aktuellen Arbeitsverzeichnis ist. Möglicherweise möchten Sie einen absoluten Pfad verwenden / konstruieren.
  • Fehlend using/ Closeist ein sehr häufiger Grund dafür, "warum Daten nicht in eine Datei geschrieben werden".
Bali C.
quelle
3
Stellen Sie sicher, dass usingIhre Streams wie in der anderen Antwort gezeigt sind - stackoverflow.com/a/7571213/477420
Alexei Levenkov
5
Notwendigkeit using System.IO;zu verwenden Stream und Stream .
Fett
1
Es sollte auch beachtet werden, dass der StreamWriter die Datei erstellt, wenn die Datei nicht vorhanden ist, wenn er versucht, WriteLine zu erstellen. In diesem Fall wird write.txt erstellt, wenn es beim Aufruf von WriteLine nicht vorhanden ist.
TheMiddleMan
3
Erwähnenswert ist auch, dass das Anhängen von Text an eine Datei überlastet ist: new StreamWriter("write.txt", true)Es wird eine Datei erstellt, wenn keine Datei vorhanden ist, andernfalls wird eine Datei an eine vorhandene Datei angehängt.
ArieKanarie
Erwähnenswert ist auch, dass Sie, wenn Sie den Streamreader und den Streamwriter in Verbindung mit einem FileStream verwenden (anstelle des Dateinamens übergeben), Dateien im schreibgeschützten und / oder freigegebenen Modus öffnen können.
Simon Zyx
18
FileStream fs = new FileStream(txtSourcePath.Text,FileMode.Open, FileAccess.Read);
using(StreamReader sr = new StreamReader(fs))
{
   using (StreamWriter sw = new StreamWriter(Destination))
   {
            sw.writeline("Your text");
    }
}
Swapnil
quelle
1
Warum antwortest du nicht fsam Ende?
LuckyLikey
1
@LuckyLikey, weil StreamReader das für Sie erledigt. Die Verschachtelung der 2. Verwendung ist jedoch nicht erforderlich
Novaterata
Können Sie erklären? Warum sollte StreamReader fs entsorgen? Es kann sr nur entsorgen, soweit ich sehen kann. Benötigen wir hier eine dritte using-Anweisung?
Philm
Sie entsorgen niemals ein Objekt in einer using-Anweisung. Wenn die Anweisung zurückgegeben wird, wird die Dispose-Methode automatisch aufgerufen, und es spielt keine Rolle, ob die Anweisungen verschachtelt sind oder nicht. Am Ende ist alles im Aufrufstapel angeordnet.
Patrik Forsberg
11
using (var file = File.Create("pricequote.txt"))
{
    ...........                        
}

using (var file = File.OpenRead("pricequote.txt"))
{
    ..........
}

Einfach, leicht und entsorgt das Objekt, sobald Sie damit fertig sind.

Ankit Dass
quelle
10

Der einfachste Weg, aus einer Datei zu lesen und in eine Datei zu schreiben:

//Read from a file
string something = File.ReadAllText("C:\\Rfile.txt");

//Write to a file
using (StreamWriter writer = new StreamWriter("Wfile.txt"))
{
    writer.WriteLine(something);
}
Yazarloo
quelle
5
Warum nicht File.WriteAllTextzum Schreiben eines Teils?
Peter Mortensen
9

@AlexeiLevenkov hat mich auf einen anderen "einfachsten Weg" hingewiesen, nämlich die Erweiterungsmethode . Es dauert nur ein wenig Codierung und bietet dann die absolut einfachste Möglichkeit zum Lesen / Schreiben. Außerdem bietet es die Flexibilität, Variationen gemäß Ihren persönlichen Anforderungen zu erstellen. Hier ist ein vollständiges Beispiel:

Dies definiert die Erweiterungsmethode für den stringTyp. Beachten Sie, dass das einzige, was wirklich zählt, das Funktionsargument mit dem zusätzlichen Schlüsselwort thisist, das es auf das Objekt verweist, an das die Methode angehängt ist. Der Klassenname spielt keine Rolle; Die Klasse und Methode müssen deklariert werden static.

using System.IO;//File, Directory, Path

namespace Lib
{
    /// <summary>
    /// Handy string methods
    /// </summary>
    public static class Strings
    {
        /// <summary>
        /// Extension method to write the string Str to a file
        /// </summary>
        /// <param name="Str"></param>
        /// <param name="Filename"></param>
        public static void WriteToFile(this string Str, string Filename)
        {
            File.WriteAllText(Filename, Str);
            return;
        }

        // of course you could add other useful string methods...
    }//end class
}//end ns

So verwenden Sie das string extension method: Beachten Sie, dass es sich automatisch auf Folgendes bezieht class Strings:

using Lib;//(extension) method(s) for string
namespace ConsoleApp_Sandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            "Hello World!".WriteToFile(@"c:\temp\helloworld.txt");
            return;
        }

    }//end class
}//end ns

Ich hätte das selbst nie gefunden, aber es funktioniert großartig, also wollte ich das teilen. Habe Spaß!

Roland
quelle
7

Dies sind die besten und am häufigsten verwendeten Methoden zum Schreiben und Lesen von Dateien:

using System.IO;

File.AppendAllText(sFilePathAndName, sTextToWrite);//add text to existing file
File.WriteAllText(sFilePathAndName, sTextToWrite);//will overwrite the text in the existing file. If the file doesn't exist, it will create it. 
File.ReadAllText(sFilePathAndName);

Die alte Methode, die mir am College beigebracht wurde, war die Verwendung von Stream Reader / Stream Writer, aber die Datei- E / A-Methoden sind weniger umständlich und erfordern weniger Codezeilen. Sie können "Datei" eingeben. in Ihrer IDE (stellen Sie sicher, dass Sie die System.IO-Importanweisung einschließen) und sehen Sie alle verfügbaren Methoden. Im Folgenden finden Sie Beispielmethoden zum Lesen / Schreiben von Zeichenfolgen in / aus Textdateien (.txt.) Mit einer Windows Forms-App.

Fügen Sie einer vorhandenen Datei Text hinzu:

private void AppendTextToExistingFile_Click(object sender, EventArgs e)
{
    string sTextToAppend = txtMainUserInput.Text;
    //first, check to make sure that the user entered something in the text box.
    if (sTextToAppend == "" || sTextToAppend == null)
    {MessageBox.Show("You did not enter any text. Please try again");}
    else
    {
        string sFilePathAndName = getFileNameFromUser();// opens the file dailog; user selects a file (.txt filter) and the method returns a path\filename.txt as string.
        if (sFilePathAndName == "" || sFilePathAndName == null)
        {
            //MessageBox.Show("You cancalled"); //DO NOTHING
        }
        else 
        {
            sTextToAppend = ("\r\n" + sTextToAppend);//create a new line for the new text
            File.AppendAllText(sFilePathAndName, sTextToAppend);
            string sFileNameOnly = sFilePathAndName.Substring(sFilePathAndName.LastIndexOf('\\') + 1);
            MessageBox.Show("Your new text has been appended to " + sFileNameOnly);
        }//end nested if/else
    }//end if/else

}//end method AppendTextToExistingFile_Click

Rufen Sie den Dateinamen vom Benutzer über den Datei-Explorer / Dialogfeld "Datei öffnen" ab (Sie benötigen diesen, um vorhandene Dateien auszuwählen).

private string getFileNameFromUser()//returns file path\name
{
    string sFileNameAndPath = "";
    OpenFileDialog fd = new OpenFileDialog();
    fd.Title = "Select file";
    fd.Filter = "TXT files|*.txt";
    fd.InitialDirectory = Environment.CurrentDirectory;
    if (fd.ShowDialog() == DialogResult.OK)
    {
        sFileNameAndPath = (fd.FileName.ToString());
    }
    return sFileNameAndPath;
}//end method getFileNameFromUser

Text aus einer vorhandenen Datei abrufen:

private void btnGetTextFromExistingFile_Click(object sender, EventArgs e)
{
    string sFileNameAndPath = getFileNameFromUser();
    txtMainUserInput.Text = File.ReadAllText(sFileNameAndPath); //display the text
}
technoman23
quelle
5

Oder wenn es wirklich um Linien geht:

System.IO.File enthält auch eine statische Methode WriteAllLines , sodass Sie Folgendes tun können:

IList<string> myLines = new List<string>()
{
    "line1",
    "line2",
    "line3",
};

File.WriteAllLines("./foo", myLines);
anhoppe
quelle
5

Verwenden Sie beim Lesen das OpenFileDialog-Steuerelement, um zu einer beliebigen Datei zu navigieren, die Sie lesen möchten. Finden Sie den Code unten:

Vergessen Sie nicht, die folgende usingAnweisung hinzuzufügen , um Dateien zu lesen:using System.IO;

private void button1_Click(object sender, EventArgs e)
{
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
         textBox1.Text = File.ReadAllText(openFileDialog1.FileName);  
    }
}

Zum Schreiben von Dateien können Sie die Methode verwenden File.WriteAllText.

Tassisto
quelle
2
     class Program
    { 
         public static void Main()
        { 
            //To write in a txt file
             File.WriteAllText("C:\\Users\\HP\\Desktop\\c#file.txt", "Hello and Welcome");

           //To Read from a txt file & print on console
             string  copyTxt = File.ReadAllText("C:\\Users\\HP\\Desktop\\c#file.txt");
             Console.Out.WriteLine("{0}",copyTxt);
        }      
    }
Md.Rakibuz Sultan
quelle
1

Sie suchen die File, StreamWriterund StreamReaderKlassen.

SLaks
quelle
6
Sehr wenig hilfreiche Antwort. Das bedeutet, dass das OP diese Begriffe jetzt googeln muss, um eine Antwort zu finden. Die beste Antwort ist ein Beispiel.
tno2007
0
private void Form1_Load(object sender, EventArgs e)
    {
        //Write a file
        string text = "The text inside the file.";
        System.IO.File.WriteAllText("file_name.txt", text);

        //Read a file
        string read = System.IO.File.ReadAllText("file_name.txt");
        MessageBox.Show(read); //Display text in the file
    }
Alireza.m
quelle