Il modo più semplice per leggere e scrivere su file


343

Esistono molti modi diversi per leggere e scrivere file ( file di testo , non binari) in C #.

Ho solo bisogno di qualcosa che sia facile e utilizzi la minima quantità di codice, perché nel mio progetto lavorerò molto con i file. Ho solo bisogno di qualcosa stringperché tutto ciò di cui ho bisogno è leggere e scrivere strings.

Risposte:


546

Utilizzare File.ReadAllText e File.WriteAllText .

Non potrebbe essere più semplice ...

Esempi MSDN:

// 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);

2
Davvero molto semplice, ma allora perché è stato necessario pubblicare la domanda? OP era probabilmente, come me e i 17 sostenitori, che guardava nella direzione "sbagliata" lungo le linee di string.Write(filename). Perché la soluzione di Microsoft è più semplice / migliore della mia?
Roland,

7
@Roland, In .net, la gestione dei file è fornita dal framework, non dalle lingue (ad esempio non ci sono parole chiave C # per dichiarare e manipolare i file). Le stringhe sono un concetto più comune, così comune che fa parte di C #. Pertanto è naturale che i file conoscano le stringhe ma non il contrario.
vc 74

Xml è anche un concetto comune con tipi di dati in C # e qui troviamo ad esempio XmlDocument.Save (nome file). Ma ovviamente la differenza è che di solito un oggetto Xml corrisponde a un file, mentre diverse stringhe formano un file.
Roland,

7
@Roland se vuoi supportare "foo".Write(fileName)puoi facilmente creare un'estensione per farlo public static Write(this string value, string fileName) { File.WriteAllText(fileName, value);}e usarla nei tuoi progetti.
Alexei Levenkov,

1
C'è anche File.WriteAllLines (nome file, stringa [])
Mitch Wheat

163

Oltre a File.ReadAllText, File.ReadAllLinese File.WriteAllText(e simili helper della Fileclasse) mostrati in un'altra risposta , puoi usare StreamWriter/ StreamReaderclasses.

Scrivere un file di testo:

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

Lettura di un file di testo:

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

Appunti:

  • Puoi usare readtext.Dispose()invece di using, ma non chiuderà file / reader / writer in caso di eccezioni
  • Tenere presente che il percorso relativo è relativo alla directory di lavoro corrente. Potresti voler usare / costruire il percorso assoluto.
  • Manca using/ Closeè una ragione molto comune per "perché i dati non vengono scritti nel file".

3
Assicurati usingdei flussi, come mostrato in altra risposta - stackoverflow.com/a/7571213/477420
Alexei Levenkov

5
È necessario using System.IO;utilizzare StreamWriter e StreamReader .
grasso,

1
Va inoltre notato che se il file non esiste, StreamWriter creerà il file quando tenta di scrivere su WriteLine. In questo caso write.txt verrà creato se non esiste quando viene chiamato WriteLine.
TheMiddleMan

3
Vale anche la pena notare che c'è un sovraccarico per aggiungere testo al file: new StreamWriter("write.txt", true)creerà un file se non esiste un file, altrimenti verrà aggiunto a un file esistente.
ArieKanarie,

Vale anche la pena notare che se si utilizza lo streamreader e lo streamwriter in combinazione con un FileStream (passandolo al posto del nome file) è possibile aprire i file in modalità di sola lettura e / o condivisa.
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");
    }
}

1
Perché non disponi fsalla fine?
LuckyLikey,

1
@LuckyLikey perché StreamReader lo fa per te. La nidificazione del secondo utilizzo non è tuttavia necessaria
Novaterata,

Puoi spiegare? Perché StreamReader dovrebbe eliminare fs ?? Può disporre solo per quanto posso vedere. Abbiamo bisogno di una terza dichiarazione usando qui?
Philm,

Non disporre mai un oggetto in un'istruzione using, quando viene restituita l'istruzione, il metodo Dispose verrà chiamato automaticamente e non importa se le istruzioni sono nidificate o no, alla fine, tutto viene ordinato nello stack di chiamate.
Patrik Forsberg

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

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

Semplice, facile e inoltre elimina / pulisce l'oggetto una volta terminato.


10

Il modo più semplice per leggere da un file e scrivere su un file:

//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);
}

5
Perché non File.WriteAllTextper scrivere parte?
Peter Mortensen,

9

@AlexeiLevenkov mi ha indicato un altro "modo più semplice", ovvero il metodo di estensione . Richiede solo un po 'di codifica, quindi fornisce il modo più semplice in assoluto di leggere / scrivere, inoltre offre la flessibilità di creare variazioni in base alle proprie esigenze personali. Ecco un esempio completo:

Questo definisce il metodo di estensione sul stringtipo. Si noti che l'unica cosa che conta davvero è l'argomento della funzione con una parola chiave aggiuntiva this, che lo fa fare riferimento all'oggetto a cui è collegato il metodo. Il nome della classe non ha importanza; la classe e il metodo devono essere dichiarati 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

Ecco come usare il string extension method, nota che si riferisce automagicamente a 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

Non lo avrei mai trovato da solo, ma funziona benissimo, quindi ho voluto condividerlo. Divertiti!


7

Questi sono i metodi migliori e più comunemente usati per scrivere e leggere da file:

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);

Il vecchio modo, che mi era stato insegnato al college, era usare il lettore di stream / stream writer, ma il File metodi di I / O sono meno ingombranti e richiedono meno righe di codice. Puoi digitare "File". nel tuo IDE (assicurati di includere la dichiarazione di importazione System.IO) e vedi tutti i metodi disponibili. Di seguito sono riportati alcuni metodi per leggere / scrivere stringhe da / verso file di testo (.txt.) Usando un'app di Windows Form.

Aggiungi testo a un file esistente:

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

Ottieni il nome del file dall'utente tramite Esplora file / finestra di dialogo Apri file (ti servirà per selezionare i file esistenti).

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

Ottieni testo da un file esistente:

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

5

Oppure, se sei davvero interessato alle linee:

System.IO.File contiene anche un metodo statico WriteAllLines , quindi puoi fare:

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

File.WriteAllLines("./foo", myLines);

5

È utile leggere quando si utilizza il controllo OpenFileDialog per cercare qualsiasi file che si desidera leggere. Trova il codice qui sotto:

Non dimenticare di aggiungere la seguente usingistruzione per leggere i file:using System.IO;

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

Per scrivere i file è possibile utilizzare il metodo File.WriteAllText.


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);
        }      
    }

1

Siete alla ricerca di i File, StreamWritere StreamReaderle classi.


6
Risposta molto inutile. Ciò significa che l'OP deve ora andare su Google in questi termini nella speranza di trovare una risposta. La migliore risposta è un esempio.
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
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.